Как двусвязном списке вставить новую запись? - 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;
}

Объяснение кода листинга программы

  1. Создается новая переменная типа card *pn и ей выделяется кусок памяти с помощью malloc.
  2. В цикле запрашивается информация о новой записи, используя функцию gets.
  3. Если год издания введен в обратном порядке, выводится сообщение об ошибке и запись запрашивается заново.
  4. Устанавливаются значения полей новой записи.
  5. Устанавливаются значения указателей на предыдущую и следующую записи.
  6. Обновляется значение хвоста списка.

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


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

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

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