Как двусвязном списке вставить новую запись? - 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.
- Если год издания введен в обратном порядке, выводится сообщение об ошибке и запись запрашивается заново.
- Устанавливаются значения полей новой записи.
- Устанавливаются значения указателей на предыдущую и следующую записи.
- Обновляется значение хвоста списка.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д