Удаление узла из односвязного списка. + Сортировка - C (СИ)
Формулировка задачи:
Уважаемые! Помогите разобраться с работой функции В предпоследней строчке вывода не удаляется нулевой элемент, если есть идеи, то напишите, пожалуйста, их, чтоб исправить это...
Если есть идеи по коду, или код для сортировки односвязного списка, или то и другое, то напишите, пожалуйста, их.
void DeleteNodeByIndex(NODE *head,int k)
. Задача такова: задать список, сделать его копию, потом в копии списка удалить узлы с значением <6. Функция по отдельности конкретный узел удаляет, а если за раз удалять то получается не так как нужно. На скрине результат.#include "stdafx.h" #include <stdlib.h> #define enter putchar('\n'); struct Node { int value; Node *link; } ; typedef struct Node NODE; NODE *firsthead, *firsttail, *secondhead,*secondtail, *secondhead1,*secondtail1,*temp; void initNode(NODE **head, NODE **tail, int val); void addNodeToEnd(NODE **tail, int val); void CopyList(NODE *list1, NODE **list2);// Зробити копію списку. int NumberOfNodes(NODE *head);// Визначити число вузлів в списку. void DeleteNodeByIndex(NODE *head,int k); // Виключити k-й вузол. void display(NODE* p);//виведення списку на екран int A[]={/*6,*/8,9,2,5,3,12,8,10,12,5,7};//1-як перший елемент вже створений разом з головою, тому з другого ініціалізація int d=sizeof(A)/sizeof(A[0]);//довжина числового масиву int count=0; int _tmain(int argc, _TCHAR* argv[]) { initNode(&firsthead,&firsttail,5); for(int i=0;i<d;i++) addNodeToEnd(&firsttail, A[i]); display(firsthead); enter CopyList(firsthead, &secondhead); display(secondhead);//vuvestu kopiu enter //Вот я уюзаю функ. DeleteNodeByIndex for (int i=0;i<NumberOfNodes(secondhead);i++){ if (secondhead->value<6){ DeleteNodeByIndex(secondhead,i); secondhead=secondhead->link;} else secondhead=secondhead->link;} //Вивод того что осталось display(secondhead); enter //Удалю нулевой элемент, оно не удалит... DeleteNodeByIndex(secondhead,0); display(secondhead); enter //Удалю первый элемент DeleteNodeByIndex(secondhead,1); display(secondhead); enter return 0; } void DeleteNodeByIndex(NODE *head,int k) { NODE *temp1=head, *temp2; if (NumberOfNodes(head)) { do { temp2=temp1; if ((temp1=temp1->link)==NULL) break; } while (--k) ; if (temp1!=NULL) { temp2->link =temp1->link; free(temp1); } } return; } void display(NODE* p) { if(p->link==0) return; do { printf("%4d",p->value); if(p->link==0) break; p=p->link; }while(true); } void initNode(NODE **head, NODE **tail, int val) { *head = (NODE *) malloc(sizeof(NODE)); (*head)->value=val; (*head)->link=NULL; *tail=*head; } void CopyList(NODE *list1, NODE **list2) { NODE *temp1=list1; NODE *list2Head,*list2Tail; initNode(&list2Head,&list2Tail,temp1->value); while ((temp1=temp1->link)!=NULL) addNodeToEnd(&list2Tail, temp1->value); *list2=list2Head; } int NumberOfNodes(NODE *head) { NODE *temp=head; int num=0; while ((temp=temp->link)!=NULL) num++; return num; } void addNodeToEnd(NODE **tail, int val) { NODE* temp = (NODE *) malloc(sizeof(NODE)); temp->value=val; temp->link=NULL; (*tail)->link=temp; (*tail)=temp; return; }
Что касается результата:
Первая и вторая для проверки; тут все норм. В следующих трех должно было выйти:6,8,9,12,8,10,12,7 8,9,12,8,10,12,7 8,12,8,10,12,7
Решение задачи: «Удаление узла из односвязного списка. + Сортировка»
textual
Листинг программы
5,8,9,12,8,10,12,7 8,9,12,8,10,12,7 8,12,8,10,12,7
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д