Двусвязные списки, приложение зависает после создания нескольких элементов - C (СИ)
Формулировка задачи:
После создания 6-7, а когда особо повезет - 8-го, элемента списка программа просто обязана зависнуть и я в упор не вижу, где ошибка
#include <stdio.h>
#include <stdlib.h>
struct Node {
char NameUni[100];
int NumberStud;
int NumberFac;
struct Node *next, *prev;
int key;
};
typedef struct Node *PNode;
void AddFirst(PNode *Head, PNode *Tail ,PNode NewNode)
{
NewNode->next = *Head;
NewNode->prev = NULL;
if ( *Head )
(*Head)->prev = NewNode;
*Head = NewNode;
if ( !*Tail ) *Tail = *Head;
}
PNode CreateNode ()
{
PNode NewNode = (PNode)malloc(sizeof(PNode));
printf("\nВведите имя: \n");
scanf("%s",&NewNode->NameUni);
printf("\nВведите количество студентов: \n");
scanf("%d",&NewNode->NumberStud);
printf("\nВведите количество факультетов: \n");
scanf("%d",&NewNode->NumberFac);
NewNode->next = NULL;
NewNode->prev = NULL;
return NewNode;
}
void AddLast(PNode *Head, PNode *Tail, PNode NewNode)
{
if (*Head == NULL)
{
AddFirst(Head, Tail, NewNode);
return;
}
NewNode->prev =*Tail;
NewNode->next = NULL;
if ( *Tail )
(*Tail )->next = NewNode;
*Tail = NewNode;
}
void list(PNode Head)
{ if(!Head) {
printf("\nСписок пуст\n\n");
return;
}
PNode q = Head;
int i=1;
printf("|---|------|-----------------|----------------|---------------|\n");
printf("| № | Ключ | Название | Количество | Количество |\n");
printf("| | | Университета | Студентов | факультетов |\n");
printf("|---|------|-----------------|----------------|---------------|\n");
while (q!=NULL)
{
printf("|%3d", i++);
printf("| ");
printf("|%17s", q->NameUni);
printf("|%16d", q->NumberStud);
printf("|%15d|\n", q->NumberFac);
printf("|---|------|-----------------|----------------|---------------|\n");
q=q->next;
}
printf("\n");
}
int menu_select(void)
{
char s[100];
int c;
printf("1. Создать запись \n");
printf("2. Добавить созданную запись в начало\n");
printf("3. Добавить созданную запись в конец\n");
printf("5. Вывод на экран содержимого списка\n");
printf("11. Выход\n");
do {
printf("\nВведите номер нужного пункта: ");
scanf("%s", &s);
c = atoi(s);
printf("\n");
} while(c<0 || c>11);
return c;
}
int main(void){
PNode Head=NULL;
PNode Tail=NULL;
PNode NewNode=NULL;
char choice;
for(;;) {
choice = menu_select();
switch(choice) {
case 1: {
NewNode=NULL;
NewNode=CreateNode();
break;
}
case 2: {
if(NewNode);
AddFirst(&Head, &Tail, NewNode);
break;
}
case 3: {
if(NewNode);
AddLast( &Head, &Tail, NewNode);
break;
}
case 5: {
list(Head);
break;
}
case 11: exit(0);
}
}
return 0;
}Решение задачи: «Двусвязные списки, приложение зависает после создания нескольких элементов»
textual
Листинг программы
case 2:
{
if(NewNode)
{
AddFirst(&Head, &Tail, NewNode);
NewNode = NULL;
}
break;
}
case 3:
{
if(NewNode)
{
AddLast(&Head, &Tail, NewNode);
NewNode = NULL;
}
break;
}