Удаление и редактирование элемента в двусвязном списке - C (СИ)

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

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

Не люблю создавать темы. Но объясните мне на пальцах (на моем примере) как правильно удалить и отредактировать элемент в списке (2 разные ф-ции), ну или ткните в ошибку..
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <malloc.h>
  4. #include <locale.h>
  5. #include <string.h>
  6. #include <conio.h>
  7. struct ta
  8. {
  9. char country[128];
  10. int id, count, days;
  11. double price;
  12. struct ta* next;
  13. struct ta* prev;
  14. };
  15. struct ta *head, *tail;
  16. void create(void); // создание
  17. void list(struct ta *); // просмотр
  18. void del(struct ta *); // удаление
  19. void edit(struct ta *p);
  20. void create(void)
  21. {
  22. struct ta *p,*pred;
  23. pred=NULL;
  24. p=(struct ta *)malloc(sizeof(struct ta));
  25. printf("Введите страну: ");
  26. scanf("%s", p->country);
  27. printf("Введите продолжительность: ");
  28. scanf("%d", &p->days);
  29. printf("Введите стоимость: ");
  30. scanf("%lf", &p->price);
  31. printf("Введите количество проданных: ");
  32. scanf("%d", &p->count);
  33. p->prev=pred;
  34. if (pred != NULL)
  35. {
  36. pred->next=p;
  37. }
  38. else
  39. {
  40. head = p;
  41. pred = p;
  42. }
  43. puts(" Закончить - <esc>");
  44. tail=p;
  45. tail->next=NULL;
  46. system("cls");
  47. }
  48. void add(struct ta *p)
  49. {
  50. struct ta *pn,*pred;
  51. pn=(struct ta *)malloc(sizeof(struct ta)); // pn – указатель на новую структуру
  52. printf("Введите страну: ");
  53. scanf("%s", pn->country);
  54. printf("Введите продолжительность: ");
  55. scanf("%d", &pn->days);
  56. printf("Введите стоимость: ");
  57. scanf("%lf", &pn->price);
  58. printf("Введите количество проданных: ");
  59. scanf("%d", &pn->count);
  60. pn->prev=NULL;
  61. pn->next=p;
  62. p->prev=pn;
  63. head=pn;
  64. }
  65. void list(struct ta *p)
  66. {
  67. if (p==head)
  68. while (p != NULL)
  69. {
  70. printf("%s", p->country);
  71. printf("%d", p->days);
  72. printf("%lf", p->price);
  73. printf("\n");
  74. printf("%d", p->count);
  75. p=p->next;
  76. }
  77. else if (p==tail)
  78. while ( p!= NULL)
  79. {
  80. printf("%s", p->country);
  81. printf("%d", p->days);
  82. printf("%lf", p->price);
  83. printf("\n");
  84. printf("%d", p->count);
  85. p=p->prev;
  86. }
  87. else
  88. puts("Неверный адрес ");
  89. }
  90. void del(struct ta *p)
  91. {
  92. struct ta *pn,*temp;
  93. char country[128]; // – Строка для удаляемой страны
  94. printf("Страна: ");
  95. scanf("%s", pn->country);
  96. pn=head;
  97. while (pn!=NULL)
  98. {
  99. if (strcmp((pn->country),country)==0) // если найдена заданная страна
  100. {
  101. if (pn==head) // если найденная запись - первая
  102. {
  103. head=pn->next;
  104. head->prev=NULL;
  105. free(pn);
  106. pn=head;
  107. }
  108. else if (pn==tail) // если найденная запись - последняя
  109. {
  110. tail=pn->next;
  111. tail->next=NULL;
  112. free(pn);
  113. pn=tail;
  114. }
  115. else // удаление из средины списка
  116. {
  117. pn->next->prev=pn->prev;
  118. pn->prev->next=pn->next;
  119. temp=pn;
  120. pn=pn->next;
  121. free(temp);
  122. }
  123. }
  124. else // если заданная страна не найдена – продвигаемся по списку
  125. p=pn->next;
  126. }
  127. }
  128. void edit(struct ta *p)
  129. {
  130. struct ta *pn,*temp;
  131. char country[128]; // – Строка для удаляемой страны
  132. printf("Страна: ");
  133. scanf("%s", pn->country);
  134. pn=head;
  135. while (pn!=NULL)
  136. {
  137. if (strcmp((pn->country),country)==0) // если найдена заданная страна
  138. {
  139. printf("Введите страну: ");
  140. scanf("%s", pn->country);
  141. printf("Введите продолжительность: ");
  142. scanf("%d", &pn->days);
  143. printf("Введите стоимость: ");
  144. scanf("%lf", &pn->price);
  145. printf("Введите количество проданных: ");
  146. scanf("%d", &pn->count);
  147. }
  148. else
  149. p=pn->next;
  150. }
  151. }
  152. void main()
  153. {
  154. setlocale(LC_ALL, "Russian");
  155. int key;
  156. do
  157. {
  158. system("cls");
  159. printf("1. Показать все\n" );
  160. printf("2. Добавить\n");
  161. printf("3. Редактировать\n");
  162. printf("4. Удалить\n");
  163. printf("9. Создать \n");
  164. printf("0. Выход \n");
  165. scanf("%d", &key);
  166. switch (key)
  167. {
  168. case 1:
  169. list(head);
  170. break;
  171. case 2:
  172. add(head);
  173. break;
  174. case 3:
  175. edit(head);
  176. break;
  177. case 4:
  178. del(head);
  179. break;
  180. case 0:
  181. return 0;
  182. break;
  183. }
  184. }
  185. while (key!=27);
  186. }
2 ошибки нашла
Листинг программы
  1. printf("Страна: ");
  2. scanf("%s", country);
а не
Листинг программы
  1. printf("Страна: ");
  2. scanf("%s", pn->country);

Решение задачи: «Удаление и редактирование элемента в двусвязном списке»

textual
Листинг программы
  1.                 else
  2.                 {
  3.                     pn->next->prev=pn->prev;
  4.                     if(pn->next)
  5.                     pn->prev->next=pn->next;
  6.                     free(pn);
  7.                 }

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

В представленном коде выполняется освобождение памяти, выделенной под узел двусвязного списка, в случае, если данный узел является последним в списке. При выполнении кода происходит следующее:

  1. pn — указатель на узел, который необходимо удалить.
  2. pn->next — указатель на следующий узел в списке, инициализируется значением pn->prev (указатель на предыдущий узел).
  3. pn->prev->next — указатель на следующий узел после удаляемого, инициализируется значением pn->next (указатель на следующий узел).
  4. free(pn) — выделение памяти под узлом освобождается. В итоге представленный код выполняет удаление узла из двусвязного списка.

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


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

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

10   голосов , оценка 4.3 из 5

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

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

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