Как двусвязном списке вставить новую запись? - C (СИ)
Формулировка задачи:
Есть программа которая создает список, просматривает и должна еще добавлять например в конец списка запись. Подскажите где моя ошибка как не пробовал в начало или в конец добавить новую запись не получается видимо что то упустил.
Листинг программы
- #include <stdio.h>
- #include <conio.h>
- #include <malloc.h>
- #include <string.h>
- struct card
- {char nazv[20];
- char name[20];
- char god[4];
- struct card *v1;
- struct card *v2;
- };
- void create(void);
- void list(card *);
- void dobaflenie(void);
- struct card *head,*tail;
- main ()
- {
- char u;
- while (1)
- {
- puts("1-Create spisok");
- puts("2-Prosmotr spiska");
- puts("3-Dobavlenie new zapisi v spisok");
- puts("8-Exit");
- u=getch();
- switch(u)
- {
- case'1':create(); break;
- case'2':list(head); break;
- case'3':dobaflenie();break;
- case'8':return 0;
- default:puts("Neverno");
- }
- }
- }
- void create(void)
- {card *p,*pred;
- pred=NULL;
- do { p=(card *)malloc(sizeof(card));
- printf("Nazvanie knigi: "); gets(p->nazv);
- printf("F.I.O. avtora: "); gets(p->name);
- printf("god izdania: "); gets(p->god);
- p->v1=pred;
- if (pred != NULL)
- pred->v2=p;
- else
- head=p;
- pred=p;
- puts(" exit - <esc>");
- }
- while (getch()!=27);
- tail=p;
- tail->v2=NULL;
- }
- void list(card *p)
- {if (p==head)
- while (p != NULL)
- {puts(p->nazv);
- puts(p->name);
- puts(p->god);
- p=p->v2;
- }
- else if (p==tail)
- while ( p!= NULL)
- {puts(p->nazv);
- puts(p->name);
- puts(p->god);
- p=p->v1;
- }
- else
- puts("Neverno ");
- getch();
- }
- void dobaflenie( )
- {
- card *p,*pn;
- if (pn==NULL) printf("Nado sozdat' spisok");
- pn=(card *)malloc(sizeof(card)); // pn – указатель на новую структуру
- p=(card *)malloc(sizeof(card));
- printf("Nazvanie knigi:");
- gets(pn->nazv);
- printf("F.I.O. avtora: ");
- gets(pn->name);
- printf("god izdania: ");
- gets(pn->god);
- while (pn->god<0)
- {
- printf("God izdania ne moget bit' otricatel'nim! Vvedite povtorno!\n");
- gets(pn->god);
- }
- pn->v1=NULL;
- pn->v2=p;
- p->v1=pn;
- tail=pn;
- }
Решение задачи: «Как двусвязном списке вставить новую запись?»
textual
Листинг программы
- void dobaflenie_end(void)
- {
- card *pn; // Указатель на новую запись
- if (tail==NULL) printf("Nado sozdat' spisok");
- // В начале программы стоит инициализировать head =NULL, tail=NULL
- pn=(card *)malloc(sizeof(card)); // Выделение куска памяти для новой карты
- //-------- Без изменений ----
- printf("Nazvanie knigi:");
- gets(pn->nazv);
- printf("F.I.O. avtora: ");
- gets(pn->name);
- printf("god izdania: ");
- gets(pn->god);
- while (pn->god<0)
- {
- printf("God izdania ne moget bit' otricatel'nim! Vvedite povtorno!\n");
- gets(pn->god);
- }
- //---------------------------
- pn->v1=tail; // Для свежесозданной записи pn, предыдущая запись будет "старый" хвост
- pn->v2=NULL; // Дальше записей нет.
- tail->v2=pn; // p_tail теперь вторая с конца.
- tail = pn;
- }
Объяснение кода листинга программы
- Создается новая переменная типа card *pn и ей выделяется кусок памяти с помощью malloc.
- В цикле запрашивается информация о новой записи, используя функцию gets.
- Если год издания введен в обратном порядке, выводится сообщение об ошибке и запись запрашивается заново.
- Устанавливаются значения полей новой записи.
- Устанавливаются значения указателей на предыдущую и следующую записи.
- Обновляется значение хвоста списка.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д