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