Удаление узла из односвязного списка. + Сортировка - 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д