Двусвязные списки, приложение зависает после создания нескольких элементов - C (СИ)

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

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

После создания 6-7, а когда особо повезет - 8-го, элемента списка программа просто обязана зависнуть и я в упор не вижу, где ошибка
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. struct Node {
  5. char NameUni[100];
  6. int NumberStud;
  7. int NumberFac;
  8. struct Node *next, *prev;
  9. int key;
  10. };
  11. typedef struct Node *PNode;
  12. void AddFirst(PNode *Head, PNode *Tail ,PNode NewNode)
  13. {
  14. NewNode->next = *Head;
  15. NewNode->prev = NULL;
  16. if ( *Head )
  17. (*Head)->prev = NewNode;
  18. *Head = NewNode;
  19. if ( !*Tail ) *Tail = *Head;
  20. }
  21. PNode CreateNode ()
  22. {
  23. PNode NewNode = (PNode)malloc(sizeof(PNode));
  24. printf("\nВведите имя: \n");
  25. scanf("%s",&NewNode->NameUni);
  26. printf("\nВведите количество студентов: \n");
  27. scanf("%d",&NewNode->NumberStud);
  28. printf("\nВведите количество факультетов: \n");
  29. scanf("%d",&NewNode->NumberFac);
  30. NewNode->next = NULL;
  31. NewNode->prev = NULL;
  32. return NewNode;
  33. }
  34. void AddLast(PNode *Head, PNode *Tail, PNode NewNode)
  35. {
  36. if (*Head == NULL)
  37. {
  38. AddFirst(Head, Tail, NewNode);
  39. return;
  40. }
  41. NewNode->prev =*Tail;
  42. NewNode->next = NULL;
  43. if ( *Tail )
  44. (*Tail )->next = NewNode;
  45. *Tail = NewNode;
  46. }
  47.  
  48. void list(PNode Head)
  49. { if(!Head) {
  50. printf("\nСписок пуст\n\n");
  51. return;
  52. }
  53. PNode q = Head;
  54. int i=1;
  55. printf("|---|------|-----------------|----------------|---------------|\n");
  56. printf("| № | Ключ | Название | Количество | Количество |\n");
  57. printf("| | | Университета | Студентов | факультетов |\n");
  58. printf("|---|------|-----------------|----------------|---------------|\n");
  59.  
  60. while (q!=NULL)
  61. {
  62. printf("|%3d", i++);
  63. printf("| ");
  64. printf("|%17s", q->NameUni);
  65. printf("|%16d", q->NumberStud);
  66. printf("|%15d|\n", q->NumberFac);
  67. printf("|---|------|-----------------|----------------|---------------|\n");
  68. q=q->next;
  69. }
  70. printf("\n");
  71. }
  72.  
  73. int menu_select(void)
  74. {
  75. char s[100];
  76. int c;
  77. printf("1. Создать запись \n");
  78. printf("2. Добавить созданную запись в начало\n");
  79. printf("3. Добавить созданную запись в конец\n");
  80. printf("5. Вывод на экран содержимого списка\n");
  81. printf("11. Выход\n");
  82. do {
  83. printf("\nВведите номер нужного пункта: ");
  84. scanf("%s", &s);
  85. c = atoi(s);
  86. printf("\n");
  87. } while(c<0 || c>11);
  88. return c;
  89. }
  90. int main(void){
  91. PNode Head=NULL;
  92. PNode Tail=NULL;
  93. PNode NewNode=NULL;
  94. char choice;
  95. for(;;) {
  96. choice = menu_select();
  97. switch(choice) {
  98. case 1: {
  99. NewNode=NULL;
  100. NewNode=CreateNode();
  101. break;
  102. }
  103. case 2: {
  104. if(NewNode);
  105. AddFirst(&Head, &Tail, NewNode);
  106. break;
  107. }
  108. case 3: {
  109. if(NewNode);
  110. AddLast( &Head, &Tail, NewNode);
  111. break;
  112. }
  113. case 5: {
  114. list(Head);
  115. break;
  116. }
  117. case 11: exit(0);
  118. }
  119. }
  120. return 0;
  121. }

Решение задачи: «Двусвязные списки, приложение зависает после создания нескольких элементов»

textual
Листинг программы
  1. case 2:
  2. {
  3.     if(NewNode)
  4.     {
  5.         AddFirst(&Head, &Tail, NewNode);
  6.         NewNode = NULL;
  7.     }
  8.     break;
  9. }
  10. case 3:
  11. {
  12.     if(NewNode)
  13.     {
  14.         AddLast(&Head, &Tail, NewNode);
  15.         NewNode = NULL;
  16.     }
  17.     break;
  18. }

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


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

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

8   голосов , оценка 4.25 из 5

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

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

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