fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef int DATA;
  5.  
  6. typedef struct node {
  7. struct node *next;
  8. DATA data;
  9. } NODE;
  10.  
  11. NODE list_head;
  12.  
  13. void addNewNodeToHeadLocal(struct node *root, int data, int pos) {
  14. NODE *newNode;
  15. if (root->next == 0 || pos <= 0) {
  16. if ((newNode = malloc(sizeof(NODE))) != 0) {
  17. newNode->next = root->next;
  18. root->next = newNode;
  19. newNode->data = data;
  20. }
  21. } else {
  22. addNewNodeToHeadLocal(root->next, data, pos - 1);
  23. }
  24. }
  25.  
  26. void addNewNodeToHead(DATA *data, int pos) {
  27. addNewNodeToHeadLocal(&list_head, (*data)++, pos - 1);
  28. }
  29.  
  30. void deleteFirstNodeLocal(struct node *root, int pos, int key) {
  31. NODE *prevNode;
  32. if (pos <= 0) {
  33. if (root->next) {
  34. prevNode = root->next;
  35. root->next = prevNode->next;
  36. free(prevNode);
  37. } else {
  38. printf("%d番目の要素はありません。\n",key);
  39. }
  40. } else {
  41. if (root->next)
  42. deleteFirstNodeLocal(root->next, pos - 1, key);
  43. else
  44. deleteFirstNodeLocal(root, pos - 1, key);
  45. }
  46. }
  47.  
  48. void deleteFirstNode(int pos,int key) {
  49. deleteFirstNodeLocal(&list_head, pos - 1,key);
  50. }
  51.  
  52. void showList(void) {
  53. NODE *pos;
  54. pos = list_head.next;
  55. while ( pos != NULL ) {
  56. printf("%d ", pos->data);
  57. pos = pos->next;
  58. }
  59. printf("\n");
  60. }
  61.  
  62. int main() {
  63. int key, pos;
  64. DATA value;
  65.  
  66. value = 1;
  67. list_head.next = NULL;
  68. while (key != 9) {
  69. showList();
  70. printf("1.n番目を追加、2.n番目を削除、9.終了:");
  71. scanf("%d",&key);
  72. switch (key) {
  73. case 1:
  74. printf("何番目を追加しますか:");
  75. scanf("%d",&pos);
  76. addNewNodeToHead(&value, pos);
  77. break;
  78. case 2:
  79. printf("何番目を削除しますか:");
  80. scanf("%d",&pos);
  81. deleteFirstNode(pos,pos);
  82. break;
  83. default:
  84. break;
  85. }
  86. }
  87. while (list_head.next)
  88. deleteFirstNode(0,0);
  89. return 0;
  90. }
  91.  
  92. /* end */
Success #stdin #stdout 0.02s 1856KB
stdin
1
1
1
2
1
2
2
2
2
2
9
stdout
1.n番目を追加、2.n番目を削除、9.終了:何番目を追加しますか:1 
1.n番目を追加、2.n番目を削除、9.終了:何番目を追加しますか:1 2 
1.n番目を追加、2.n番目を削除、9.終了:何番目を追加しますか:1 3 2 
1.n番目を追加、2.n番目を削除、9.終了:何番目を削除しますか:1 2 
1.n番目を追加、2.n番目を削除、9.終了:何番目を削除しますか:1 
1.n番目を追加、2.n番目を削除、9.終了: