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

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


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

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

6   голосов , оценка 4.167 из 5
Похожие ответы