Удаление указанного узла c из односвязного списка в C - PullRequest
0 голосов
/ 01 мая 2020

Я создал односвязный список в C и пытаюсь закодировать функцию, которая удаляет указанный элемент c из списка на основе предоставленного целочисленного значения, которое соответствует конкретному узлу.

void deleteNodeVar(int val)
{
    struct node *t, *temp, *temp2;

    t = START;
    while(t -> info != val)
    {
        if(t -> ptr == NULL) { break; }
        t = t -> ptr;
    }
    printf("\nfound the val to be %d\n",t -> info);
    temp = t -> ptr;
    t -> ptr = temp -> ptr;
    printf("now will free the node with value %d \n",t -> info);
    free(t);

}

После некоторой отладки я обнаружил: функция работает правильно, так как она успешно обнаруживает и удаляет узел

, но печать всего списка дает странные результаты.

полный код :

#include <stdio.h>
#include <stdlib.h>

struct node
{
    int info;
    struct node *ptr;
};

struct node *START = NULL;

struct node* createNode()
{
    struct node *p;
    p = (struct node*) malloc(sizeof(struct node));
    return p;
}

//inserting node
void insertNode(int val)
{
    struct node *temp, *t;
    temp = createNode();
    temp -> info = val;
    temp -> ptr = NULL;

    if(START == NULL){ START = temp; }
    else
    {
        t = START;
        while(t -> ptr != NULL)
        {
            t = t -> ptr;
        }
        t -> ptr = temp;
    }   
}


void pop()
{
    struct node *t;
    t = START;
    if(START == NULL) { printf("THE LIST IS EMPTY\n"); }
    else
    {
        START = START -> ptr;
        free(t);
    }
}

//here are the 2 functions below in which I have problem
void deleteNodeVar(int val)
{
    struct node *t, *temp, *temp2;

    t = START;
    while(t -> info != val)
    {
        if(t -> ptr == NULL) { break; }
        t = t -> ptr;
    }
    printf("\nfound the val to be %d\n",t -> info);
    temp = t -> ptr;
    t -> ptr = temp -> ptr;
    printf("now will free the val with value %d \n",t -> info);
    free(t);

}

void viewList()
{
    struct node *t, *temp;
    t = START;

    while(t != NULL)
    {
        printf("%d -> ",t->info);
        t = t -> ptr;
    }

}

int main() 
{

    insertNode(10);
    insertNode(20);
    insertNode(40);
    insertNode(100);

    viewList();
    int v;
    printf("\nEnter to delete: ");
    scanf("%d",&v);
    deleteNodeVar(v);
    viewList();

}

Вот снимок экрана с выводом, который я получаю после попытки распечатать список после удаления узла со значением 40:

I is running into an infinite loop with these repeating values

Он сталкивается с бесконечным l oop с этими повторяющимися значениями!

Ответы [ 2 ]

1 голос
/ 01 мая 2020

Для начала плохая идея - использовать глобальную переменную в качестве указателя на узел heda в списке и когда функции зависят от глобальной переменной. В этом случае вы не можете создать более одного списка.

Тем не менее функцию deleteNodeVar можно определить следующим образом

int deleteNodeVar(int val)
{
    node *prev = NULL, *current = START;

    while ( current != NULL && current->info != val )
    {
        prev = current;
        current = current->ptr;
    }

    int success = current != NULL;

    if ( success )
    {
        if ( prev == NULL )
        {
            START = START->ptr;
        }
        else
        {
            prev->ptr = current->ptr;
        }

        free( current );
    }

    return success;
}
0 голосов
/ 01 мая 2020

Согласно вашей функции удаления, если узел отсутствует в списке, который вы хотите удалить, но даже после того, как ваша функция удаления выдаст сообщение, что

found the val to be

, что совершенно неверно .... так что вы можете написать свою функцию удаления, как это

void deleteNodeVar(int val)
{
    node *p ='\0', *n = START;
     int flag=0;

    while ( n != '\0' && n->info != val )
    {
        p =n;
        n =n->ptr;
    }
     if(n!='\0')
          flag=1;


    if ( flag )
    {
        if ( p == '\0' )
        {
            START = START->ptr;
        }
        else
        {
            p->ptr = n->ptr;
        }
              printf("\nfound the val to be %d\n",n-> info);
        free( n );
    }

    else
        printf("The node is not present list\n");
}
...