Ошибка при добавлении нового элемента в список - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Есть код для односвязного списка. Без функций всё работает, при попытке сделать в виде функций, при добавлении нового элемента в список, - программа вылетает. В чем причина?
Листинг программы
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. struct Node
  6. {
  7. int number;
  8. Node* next;
  9. };
  10. struct Node* head;
  11. void add_numb(Node *head);
  12. void show_list(Node *head);
  13. void search_numb(Node *head);
  14. void del_elem(Node *head);
  15. void del_list(Node *head);
  16. void count_elem (Node *head);
  17. void sort(Node *head);
  18. void item()
  19. {
  20. int Key;
  21. do {
  22. system("cls");
  23. printf("\n");
  24. printf("\nHello! Possible operations (select 0 to 7):\n");
  25. printf ("1. Add Element\n");
  26. printf ("2. Show List\n");
  27. printf ("3. Search Element\n");
  28. printf ("4. Delete Element\n");
  29. printf ("5. Delete List\n");
  30. printf ("6. Count Elements\n");
  31. printf ("7. Sort List\n");
  32. printf ("0. Exit\n");
  33. scanf("%d",&Key);
  34. switch(Key)
  35. {
  36. case 1:add_numb(head);break;
  37. case 2:show_list(head);break;
  38. case 3:search_numb(head);break;
  39. case 4:del_elem(head);break;
  40. case 5:del_list(head);break;
  41. case 6:count_elem(head);break;
  42. case 7:sort(head);break;
  43. }
  44. } while(Key!=0);
  45. }
  46. void add_numb(Node *head)
  47. {
  48. system("cls");
  49. int numb = -1;
  50. printf ("Input Number: ");
  51. scanf ("%d", numb);
  52. Node* ptr = new Node;
  53. ptr->number = numb;
  54. ptr->next = NULL;
  55. if (head == NULL)
  56. head = ptr;
  57. else
  58. {
  59. Node * temp = head;
  60. while (temp->next)
  61. temp = temp->next;
  62. temp->next = ptr;
  63. }
  64. system("pause");
  65. }
  66. void show_list(Node *head)
  67. {
  68. system("cls");
  69. if (head == NULL)
  70. {
  71. printf ("\t!!! List is Empty !!!\n\n");
  72. system("pause");
  73. } else
  74. {
  75. printf ("* * * * * List * * * * *\n\n");
  76. Node* ptr = head;
  77. while (ptr)
  78. {
  79. printf ("%d ", ptr->number);
  80. ptr = ptr->next;
  81. }
  82. printf ("\n\n");
  83. system("pause");
  84. }
  85. }
  86. void search_numb(Node *head)
  87. {
  88. system("cls");
  89. if (head == NULL)
  90. {
  91. printf("\t!!! List is Empty !!!\n\n");
  92. system("pause");
  93. } else
  94. {
  95. int key = -1;
  96. printf("Input element for search: ");
  97. scanf("%d", key);
  98. Node * ptr = head;
  99. while ((ptr) && (key != ptr->number))
  100. ptr = ptr->next;
  101. if (ptr && (key == ptr->number))
  102. printf("\n\t!!! Element is found !!!\n");
  103. else
  104. printf("\n\t!!! Element is not found !!!\n");
  105. system("pause");
  106. }
  107. }
  108. void del_elem(Node *head)
  109. {
  110. system("cls");
  111. if (head == NULL)
  112. {
  113. printf("\t!!! List is Empty !!!\n\n");
  114. system("pause");
  115. } else
  116. {
  117. int key = -1;
  118. printf("Input element for delete: ");
  119. scanf ("%d", key);
  120. Node * ptr = head;
  121. Node* prevPtr = ptr;
  122. while ((ptr) && (key != ptr->number))
  123. {
  124. prevPtr = ptr;
  125. ptr = ptr->next;
  126. }
  127. if (ptr && (key == ptr->number))
  128. {
  129. if (ptr == head)
  130. head = ptr->next;
  131. else
  132. prevPtr->next = ptr->next;
  133. delete ptr;
  134. printf("\n\t!!! Element successfully deleted !!!\n");
  135. } else
  136. printf("\n\t!!! Element is not found !!!\n");
  137. system("pause");
  138. }
  139. }
  140. void del_list(Node *head)
  141. {
  142. system("cls");
  143. if (head == NULL)
  144. {
  145. printf("\t!!! List is Empty !!!\n\n");
  146. system("pause");
  147. } else
  148. {
  149. Node *ptr = head;
  150. Node *temp;
  151. while(ptr)
  152. {
  153. temp = ptr;
  154. ptr = ptr->next;
  155. delete temp;
  156. }
  157. head = 0;
  158. printf("\n\t!!! List successfully deleted !!!\n");
  159. system("pause");
  160. }
  161. }
  162. void count_elem(Node *head)
  163. {
  164. system("cls");
  165. if (head == NULL)
  166. {
  167. printf("\t!!! List is Empty !!!\n\n");
  168. system("pause");
  169. } else
  170. {
  171. int count = 0;
  172. Node* ptr = head;
  173. while (ptr)
  174. {
  175. count++;
  176. ptr = ptr->next;
  177. }
  178. printf("Amount of elements in list: \n\n");
  179. printf("%d", count);
  180. printf("\n\n");
  181. system("pause");
  182. }
  183. }
  184. void sort(Node *head)
  185. {
  186. system("cls");
  187. if (head == NULL)
  188. {
  189. printf("\t!!! List is Empty! !!!\n\n");
  190. system("pause");
  191. } else
  192. {
  193. Node *a = NULL;
  194. Node *b = NULL;
  195. Node *c = NULL;
  196. Node *e = NULL;
  197. Node *tmp = NULL;
  198. while (e != head->next)
  199. {
  200. c = a = head;
  201. b = a->next;
  202. while (a != e)
  203. {
  204. if (a->number > b->number)
  205. {
  206. if (a == head)
  207. {
  208. tmp = b -> next;
  209. b->next = a;
  210. a->next = tmp;
  211. head = b;
  212. c = b;
  213. }
  214. else
  215. {
  216. tmp = b->next;
  217. b->next = a;
  218. a->next = tmp;
  219. c->next = b;
  220. c = b;
  221. }
  222. }
  223. else
  224. {
  225. c = a;
  226. a = a->next;
  227. }
  228. b = a->next;
  229. if (b == e)
  230. e = a;
  231. }
  232. }
  233. printf("\n\t!!! List successfully sorted !!!\n");
  234. printf("\n\n");
  235. system("pause");
  236. }
  237. }
  238. int main()
  239. {
  240. head = NULL;
  241. item();
  242. printf("\n");
  243. return 0;
  244. }

Решение задачи: «Ошибка при добавлении нового элемента в список»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5.  
  6. typedef struct node_t
  7. {
  8.    int number;
  9.    struct node_t* next;
  10. }  Node;
  11.  
  12. void add_numb(Node** head);
  13. void show_list(Node* head);
  14. void search_numb(Node* head);
  15. void del_elem(Node** head);
  16. void del_list(Node** head);
  17. void count_elem(Node* head);
  18. void sort(Node** head);
  19.  
  20. void item()
  21. {
  22.    Node* head = NULL;
  23.  
  24.    int Key;
  25.    do
  26.    {
  27.       system("cls");
  28.       printf("\n");
  29.       printf("\nHello! Possible operations (select 0 to 7):\n");
  30.       printf("1. Add Element\n");
  31.       printf("2. Show List\n");
  32.       printf("3. Search Element\n");
  33.       printf("4. Delete Element\n");
  34.       printf("5. Delete List\n");
  35.       printf("6. Count Elements\n");
  36.       printf("7. Sort List\n");
  37.       printf("0. Exit\n");
  38.  
  39.       scanf("%d", &Key);
  40.       switch (Key)
  41.       {
  42.          case 1:
  43.             add_numb(&head);
  44.             break;
  45.          case 2:
  46.             show_list(head);
  47.             break;
  48.          case 3:
  49.             search_numb(head);
  50.             break;
  51.          case 4:
  52.             del_elem(&head);
  53.             break;
  54.          case 5:
  55.             del_list(&head);
  56.             break;
  57.          case 6:
  58.             count_elem(head);
  59.             break;
  60.          case 7:
  61.             sort(&head);
  62.             break;
  63.       }
  64.    }
  65.    while (Key != 0);
  66.  
  67.    del_list(&head);
  68. }
  69.  
  70. void add_numb(Node** head)
  71. {
  72.    system("cls");
  73.    int numb = -1;
  74.    printf("Input Number: ");
  75.    scanf("%d", &numb);
  76.    Node* ptr = (Node*) malloc(sizeof(Node));
  77.    ptr->number = numb;
  78.    ptr->next = NULL;
  79.    if (*head == NULL)
  80.    {
  81.       *head = ptr;
  82.    }
  83.    else
  84.    {
  85.       Node* temp = *head;
  86.       while (temp->next)
  87.       {
  88.          temp = temp->next;
  89.       }
  90.       temp->next = ptr;
  91.    }
  92.    system("pause");
  93. }
  94.  
  95. void show_list(Node* head)
  96. {
  97.    system("cls");
  98.    if (head == NULL)
  99.    {
  100.       printf("\t!!! List is Empty !!!\n\n");
  101.       system("pause");
  102.    }
  103.    else
  104.    {
  105.       printf("* * * * * List * * * * *\n\n");
  106.       Node* ptr = head;
  107.       while (ptr)
  108.       {
  109.          printf("%d ", ptr->number);
  110.          ptr = ptr->next;
  111.       }
  112.       printf("\n\n");
  113.       system("pause");
  114.    }
  115. }
  116.  
  117. void search_numb(Node* head)
  118. {
  119.    system("cls");
  120.    if (head == NULL)
  121.    {
  122.       printf("\t!!! List is Empty !!!\n\n");
  123.       system("pause");
  124.    }
  125.    else
  126.    {
  127.       int key = -1;
  128.       printf("Input element for search: ");
  129.       scanf("%d", &key);
  130.       Node* ptr = head;
  131.       while ((ptr) && (key != ptr->number))
  132.       {
  133.          ptr = ptr->next;
  134.       }
  135.       if (ptr && (key == ptr->number))
  136.       {
  137.          printf("\n\t!!! Element is found !!!\n");
  138.       }
  139.       else
  140.       {
  141.          printf("\n\t!!! Element is not found !!!\n");
  142.       }
  143.       system("pause");
  144.    }
  145. }
  146.  
  147. void del_elem(Node** head)
  148. {
  149.    system("cls");
  150.    if (head == NULL)
  151.    {
  152.       printf("\t!!! List is Empty !!!\n\n");
  153.       system("pause");
  154.    }
  155.    else
  156.    {
  157.       int key = -1;
  158.       printf("Input element for delete: ");
  159.       scanf("%d", &key);
  160.       Node* ptr = *head;
  161.       Node* prevPtr = ptr;
  162.       while ((ptr) && (key != ptr->number))
  163.       {
  164.          prevPtr = ptr;
  165.          ptr = ptr->next;
  166.       }
  167.       if (ptr && (key == ptr->number))
  168.       {
  169.          if (ptr == *head)
  170.          {
  171.             *head = ptr->next;
  172.          }
  173.          else
  174.          {
  175.             prevPtr->next = ptr->next;
  176.          }
  177.          free(ptr);
  178.          printf("\n\t!!! Element successfully deleted !!!\n");
  179.       }
  180.       else
  181.       {
  182.          printf("\n\t!!! Element is not found !!!\n");
  183.       }
  184.       system("pause");
  185.    }
  186. }
  187.  
  188. void del_list(Node** head)
  189. {
  190.    system("cls");
  191.    if (*head == NULL)
  192.    {
  193.       printf("\t!!! List is Empty !!!\n\n");
  194.       system("pause");
  195.    }
  196.    else
  197.    {
  198.       Node* ptr = *head;
  199.       Node* temp;
  200.       while (ptr)
  201.       {
  202.          temp = ptr;
  203.          ptr = ptr->next;
  204.          free(temp);
  205.       }
  206.       *head = 0;
  207.       printf("\n\t!!! List successfully deleted !!!\n");
  208.       system("pause");
  209.    }
  210. }
  211.  
  212. void count_elem(Node* head)
  213. {
  214.    system("cls");
  215.    if (head == NULL)
  216.    {
  217.       printf("\t!!! List is Empty !!!\n\n");
  218.       system("pause");
  219.    }
  220.    else
  221.    {
  222.       int count = 0;
  223.       Node* ptr = head;
  224.       while (ptr)
  225.       {
  226.          count++;
  227.          ptr = ptr->next;
  228.       }
  229.       printf("Amount of elements in list: \n\n");
  230.       printf("%d", count);
  231.       printf("\n\n");
  232.       system("pause");
  233.    }
  234. }
  235.  
  236. void sort(Node** head)
  237. {
  238.    system("cls");
  239.    if (*head == NULL)
  240.    {
  241.       printf("\t!!! List is Empty! !!!\n\n");
  242.       system("pause");
  243.    }
  244.    else
  245.    {
  246.       Node* a = NULL;
  247.       Node* b = NULL;
  248.       Node* c = NULL;
  249.       Node* e = NULL;
  250.       Node* tmp = NULL;
  251.       while (e != (*head)->next)
  252.       {
  253.          c = a = *head;
  254.          b = a->next;
  255.          while (a != e)
  256.          {
  257.             if (a->number > b->number)
  258.             {
  259.                if (a == *head)
  260.                {
  261.                   tmp = b -> next;
  262.                   b->next = a;
  263.                   a->next = tmp;
  264.                   *head = b;
  265.                   c = b;
  266.                }
  267.                else
  268.                {
  269.                   tmp = b->next;
  270.                   b->next = a;
  271.                   a->next = tmp;
  272.                   c->next = b;
  273.                   c = b;
  274.                }
  275.             }
  276.             else
  277.             {
  278.                c = a;
  279.                a = a->next;
  280.             }
  281.             b = a->next;
  282.             if (b == e)
  283.             {
  284.                e = a;
  285.             }
  286.          }
  287.       }
  288.       printf("\n\t!!! List successfully sorted !!!\n");
  289.       printf("\n\n");
  290.       system("pause");
  291.    }
  292. }
  293.  
  294. int main()
  295. {
  296.    item();
  297.    return 0;
  298. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.154 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы