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

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

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

Уважаемые! Помогите разобраться с работой функции

void DeleteNodeByIndex(NODE *head,int k)

. Задача такова: задать список, сделать его копию, потом в копии списка удалить узлы с значением <6. Функция по отдельности конкретный узел удаляет, а если за раз удалять то получается не так как нужно. На скрине результат.
Листинг программы
  1. #include "stdafx.h"
  2. #include <stdlib.h>
  3. #define enter putchar('\n');
  4. struct Node {
  5. int value;
  6. Node *link;
  7. } ;
  8. typedef struct Node NODE;
  9. NODE *firsthead, *firsttail, *secondhead,*secondtail, *secondhead1,*secondtail1,*temp;
  10. void initNode(NODE **head, NODE **tail, int val);
  11. void addNodeToEnd(NODE **tail, int val);
  12. void CopyList(NODE *list1, NODE **list2);// Зробити копію списку.
  13. int NumberOfNodes(NODE *head);// Визначити число вузлів в списку.
  14. void DeleteNodeByIndex(NODE *head,int k); // Виключити k-й вузол.
  15. void display(NODE* p);//виведення списку на екран
  16. int A[]={/*6,*/8,9,2,5,3,12,8,10,12,5,7};//1-як перший елемент вже створений разом з головою, тому з другого ініціалізація
  17. int d=sizeof(A)/sizeof(A[0]);//довжина числового масиву
  18. int count=0;
  19. int _tmain(int argc, _TCHAR* argv[])
  20. {
  21. initNode(&firsthead,&firsttail,5);
  22. for(int i=0;i<d;i++)
  23. addNodeToEnd(&firsttail, A[i]);
  24. display(firsthead);
  25. enter
  26. CopyList(firsthead, &secondhead);
  27. display(secondhead);//vuvestu kopiu
  28. enter
  29. //Вот я уюзаю функ. DeleteNodeByIndex
  30. for (int i=0;i<NumberOfNodes(secondhead);i++){
  31. if (secondhead->value<6){
  32. DeleteNodeByIndex(secondhead,i);
  33. secondhead=secondhead->link;}
  34. else
  35. secondhead=secondhead->link;}
  36. //Вивод того что осталось
  37. display(secondhead);
  38. enter
  39. //Удалю нулевой элемент, оно не удалит...
  40. DeleteNodeByIndex(secondhead,0);
  41. display(secondhead);
  42. enter
  43. //Удалю первый элемент
  44. DeleteNodeByIndex(secondhead,1);
  45. display(secondhead);
  46. enter
  47. return 0;
  48. }
  49. void DeleteNodeByIndex(NODE *head,int k)
  50. {
  51. NODE *temp1=head, *temp2;
  52. if (NumberOfNodes(head))
  53. {
  54. do
  55. {
  56. temp2=temp1;
  57. if ((temp1=temp1->link)==NULL) break;
  58. } while (--k) ;
  59. if (temp1!=NULL)
  60. {
  61. temp2->link =temp1->link;
  62. free(temp1);
  63. }
  64. }
  65. return;
  66. }
  67. void display(NODE* p)
  68. {
  69. if(p->link==0) return;
  70. do
  71. {
  72. printf("%4d",p->value);
  73. if(p->link==0) break;
  74. p=p->link;
  75. }while(true);
  76. }
  77. void initNode(NODE **head, NODE **tail, int val)
  78. {
  79. *head = (NODE *) malloc(sizeof(NODE));
  80. (*head)->value=val;
  81. (*head)->link=NULL;
  82. *tail=*head;
  83. }
  84. void CopyList(NODE *list1, NODE **list2)
  85. {
  86. NODE *temp1=list1;
  87. NODE *list2Head,*list2Tail;
  88. initNode(&list2Head,&list2Tail,temp1->value);
  89. while ((temp1=temp1->link)!=NULL) addNodeToEnd(&list2Tail, temp1->value);
  90. *list2=list2Head;
  91. }
  92. int NumberOfNodes(NODE *head)
  93. {
  94. NODE *temp=head;
  95. int num=0;
  96. while ((temp=temp->link)!=NULL) num++;
  97. return num;
  98. }
  99. void addNodeToEnd(NODE **tail, int val)
  100. {
  101. NODE* temp = (NODE *) malloc(sizeof(NODE));
  102. temp->value=val;
  103. temp->link=NULL;
  104. (*tail)->link=temp;
  105. (*tail)=temp;
  106. return;
  107. }
В предпоследней строчке вывода не удаляется нулевой элемент, если есть идеи, то напишите, пожалуйста, их, чтоб исправить это...

Что касается результата:

Первая и вторая для проверки; тут все норм. В следующих трех должно было выйти:
Листинг программы
  1. 6,8,9,12,8,10,12,7
  2. 8,9,12,8,10,12,7
  3. 8,12,8,10,12,7
Если есть идеи по коду, или код для сортировки односвязного списка, или то и другое, то напишите, пожалуйста, их.

Решение задачи: «Удаление узла из односвязного списка. + Сортировка»

textual
Листинг программы
  1. 5,8,9,12,8,10,12,7
  2. 8,9,12,8,10,12,7
  3. 8,12,8,10,12,7

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


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

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

6   голосов , оценка 4.167 из 5

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

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

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