fork download
  1. /*------------------------------------------------
  2. 連結リストの実装例(リストヘッドによる方法)
  3.  ------------------------------------------------*/
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6.  
  7. //DATA型を定義(正体は int 型)
  8. typedef int DATA;
  9.  
  10. //NODE型の構造体定義
  11. typedef struct node {
  12. struct node *next; // 次のノードへのポインタ
  13. DATA data; // データ部
  14. } NODE;
  15.  
  16. //リストの先頭ポインタを保持する変数の宣言
  17. NODE list_head;
  18.  
  19. //関数のプロトタイプ宣言
  20. void addNewNodeToHead( DATA* ); // 先頭ノードを追加
  21. void deleteFirstNode(); // 先頭ノードを削除
  22. void showList(); //リストの表示
  23.  
  24. /*---------------------------------------
  25. メイン関数
  26. ---------------------------------------*/
  27. int main()
  28. {
  29. int key;
  30. DATA value = 1; //格納する値を生成するための変数
  31.  
  32. // リストヘッドの初期化
  33. list_head.next = NULL;
  34.  
  35. //終了の 9 が入力されるまで繰り返す
  36. while( key != 9 ) {
  37.  
  38. //リストの表示
  39. showList();
  40.  
  41. //メニューを表示
  42. printf("1.先頭に追加,2.先頭を削除,9.終了:");
  43.  
  44. //メニュー番号の入力と分岐
  45. scanf("%d",&key);
  46. switch( key ) {
  47.  
  48. case 1: //リストの先頭にデータを追加
  49.  
  50. //追加するDATA(いまは整数値)を引数に追加関数をよぶ
  51. addNewNodeToHead( &value ); //注意:ノードを追加後,ついでに value をインクリメントしている
  52. break;
  53.  
  54. case 2: //先頭のデータを削除
  55.  
  56. //先頭の要素を削除する関数をよぶ
  57. deleteFirstNode();
  58. break;
  59. }
  60. }
  61.  
  62. return 0;
  63. }
  64.  
  65. //リストの先頭にノードを追加する
  66. void addNewNodeToHead( DATA *d )
  67. {
  68. int i,key;
  69. NODE *newNode, *pos;
  70.  
  71. printf("何番目を追加しますか:");
  72. scanf("%d",&key);
  73.  
  74. if(key == 0)
  75. {
  76. printf("0番目には追加できません。\n");
  77. return ;
  78. }
  79. pos = &list_head;
  80.  
  81. for(i = 0; i < key-1; i++)
  82. {
  83. if(pos->next == NULL)
  84. break;
  85. pos = pos->next;
  86. }
  87.  
  88. if(i != key - 1)
  89. {
  90. printf("%d番目には追加できません。\n",key);
  91. return ;
  92. }
  93. newNode = (NODE *)malloc(sizeof(NODE));
  94.  
  95. if(newNode == NULL)
  96. exit(1);
  97.  
  98. newNode->next = pos->next;
  99. newNode->data = (*d)++;
  100. pos->next = newNode;
  101. }
  102.  
  103. // リストの先頭ノードを削除する
  104. void deleteFirstNode()
  105. {
  106. int i,key;
  107. NODE *pos, *prevNode;
  108.  
  109. printf("何番目を削除しますか:");
  110. scanf("%d",&key);
  111.  
  112. if(key == 0)
  113. return ;
  114.  
  115. pos = &list_head;
  116.  
  117. for(i = 0; i < key-1; i++)
  118. {
  119. if(pos->next == NULL)
  120. break;
  121. pos = pos->next;
  122. }
  123.  
  124. if(i != key - 1)
  125. {
  126. printf("%d:番目の要素はありません。\n",key);
  127. return ;
  128. }
  129. if(pos->next == NULL)
  130. {
  131. printf("%d:番目の要素はありません。\n",key);
  132. return ;
  133. }
  134.  
  135. prevNode = pos->next;
  136. pos->next = prevNode->next;
  137.  
  138. }
  139.  
  140. //連結リストの状態を表示する
  141. void showList()
  142. {
  143. int cnt = 0;
  144. NODE *pos; //読み出し位置にあるノードへのポインタ変数
  145.  
  146. //最初のノードのアドレスを取得(注意: リストが空の場合は NULL が入っている)
  147. pos = list_head.next;
  148.  
  149. while(pos != NULL)
  150. {
  151. pos = pos->next;
  152. cnt++;
  153. }
  154. if(cnt != 0)
  155. printf("%d: ", cnt);
  156.  
  157. //最初のノードのアドレスを取得(注意: リストが空の場合は NULL が入っている)
  158. pos = list_head.next;
  159.  
  160. //末尾のノードまで繰り返す
  161. while ( pos != NULL ) {
  162. printf("%d ", pos->data); //データ参照して表示
  163. pos = pos->next; //次のノードに進む
  164. }
  165.  
  166. printf("\n");
  167. }
Success #stdin #stdout 0.01s 1856KB
stdin
1
1
1
2
1
2
2
2
2
2
9
stdout
1.先頭に追加,2.先頭を削除,9.終了:何番目を追加しますか:1: 1 
1.先頭に追加,2.先頭を削除,9.終了:何番目を追加しますか:2: 1 2 
1.先頭に追加,2.先頭を削除,9.終了:何番目を追加しますか:3: 1 3 2 
1.先頭に追加,2.先頭を削除,9.終了:何番目を削除しますか:2: 1 2 
1.先頭に追加,2.先頭を削除,9.終了:何番目を削除しますか:1: 1 
1.先頭に追加,2.先頭を削除,9.終了: