Двусвязные списки, приложение зависает после создания нескольких элементов - 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;
}

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


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

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

8   голосов , оценка 4.25 из 5
Похожие ответы