Как двусвязном списке вставить новую запись? - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Есть программа которая создает список, просматривает и должна еще добавлять например в конец списка запись. Подскажите где моя ошибка как не пробовал в начало или в конец добавить новую запись не получается видимо что то упустил.
Листинг программы
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <malloc.h>
  4. #include <string.h>
  5. struct card
  6. {char nazv[20];
  7. char name[20];
  8. char god[4];
  9. struct card *v1;
  10. struct card *v2;
  11. };
  12. void create(void);
  13. void list(card *);
  14. void dobaflenie(void);
  15. struct card *head,*tail;
  16. main ()
  17. {
  18. char u;
  19. while (1)
  20. {
  21. puts("1-Create spisok");
  22. puts("2-Prosmotr spiska");
  23. puts("3-Dobavlenie new zapisi v spisok");
  24. puts("8-Exit");
  25. u=getch();
  26. switch(u)
  27. {
  28. case'1':create(); break;
  29. case'2':list(head); break;
  30. case'3':dobaflenie();break;
  31. case'8':return 0;
  32. default:puts("Neverno");
  33. }
  34. }
  35. }
  36. void create(void)
  37. {card *p,*pred;
  38. pred=NULL;
  39. do { p=(card *)malloc(sizeof(card));
  40. printf("Nazvanie knigi: "); gets(p->nazv);
  41. printf("F.I.O. avtora: "); gets(p->name);
  42. printf("god izdania: "); gets(p->god);
  43. p->v1=pred;
  44. if (pred != NULL)
  45. pred->v2=p;
  46. else
  47. head=p;
  48. pred=p;
  49. puts(" exit - <esc>");
  50. }
  51. while (getch()!=27);
  52. tail=p;
  53. tail->v2=NULL;
  54. }
  55. void list(card *p)
  56. {if (p==head)
  57. while (p != NULL)
  58. {puts(p->nazv);
  59. puts(p->name);
  60. puts(p->god);
  61. p=p->v2;
  62. }
  63. else if (p==tail)
  64. while ( p!= NULL)
  65. {puts(p->nazv);
  66. puts(p->name);
  67. puts(p->god);
  68. p=p->v1;
  69. }
  70. else
  71. puts("Neverno ");
  72. getch();
  73. }
  74. void dobaflenie( )
  75. {
  76. card *p,*pn;
  77. if (pn==NULL) printf("Nado sozdat' spisok");
  78. pn=(card *)malloc(sizeof(card)); // pn – указатель на новую структуру
  79. p=(card *)malloc(sizeof(card));
  80. printf("Nazvanie knigi:");
  81. gets(pn->nazv);
  82. printf("F.I.O. avtora: ");
  83. gets(pn->name);
  84. printf("god izdania: ");
  85. gets(pn->god);
  86. while (pn->god<0)
  87. {
  88. printf("God izdania ne moget bit' otricatel'nim! Vvedite povtorno!\n");
  89. gets(pn->god);
  90. }
  91. pn->v1=NULL;
  92. pn->v2=p;
  93. p->v1=pn;
  94. tail=pn;
  95. }

Решение задачи: «Как двусвязном списке вставить новую запись?»

textual
Листинг программы
  1. void dobaflenie_end(void)  
  2. {
  3. card *pn;    // Указатель на новую запись
  4.  
  5. if (tail==NULL) printf("Nado sozdat' spisok");
  6.    // В начале программы стоит инициализировать head =NULL, tail=NULL
  7. pn=(card *)malloc(sizeof(card)); // Выделение куска памяти для новой карты
  8.  
  9. //-------- Без изменений ----
  10. printf("Nazvanie knigi:");
  11. gets(pn->nazv);
  12. printf("F.I.O. avtora: ");
  13. gets(pn->name);
  14. printf("god izdania: ");
  15. gets(pn->god);
  16. while (pn->god<0)
  17. {
  18.    printf("God izdania ne moget bit' otricatel'nim! Vvedite povtorno!\n");
  19.    gets(pn->god);
  20. }
  21.  
  22. //---------------------------
  23.  
  24. pn->v1=tail;    // Для свежесозданной записи pn, предыдущая запись будет "старый" хвост
  25. pn->v2=NULL;  // Дальше записей нет.
  26. tail->v2=pn;    // p_tail теперь вторая с конца.
  27. tail = pn;
  28. }

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

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

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


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

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

15   голосов , оценка 3.867 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы