Двусвязные списки, приложение зависает после создания нескольких элементов - 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;
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д