Удаление узла из односвязного списка. + Сортировка - 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