从链接列表中删除节点无法正常工作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从链接列表中删除节点无法正常工作相关的知识,希望对你有一定的参考价值。

我在尝试从C中的链表中删除节点时遇到一个问题。我完全不知道我在哪里错过了这个,但不知何故,错误的节点被删除而不是预期的节点,最后一个节点也消失了,当我做的时候free()它实际上不起作用,它仍然保留并打印一些数据。谁能帮帮我吗?这是我的代码:

node=head;
temp=node->next;

if(record == 1){
    head=head->next;
    printf("
Inside if count %d node %s head %s",count, node->name, head->name);
    free(node);
}
else if (record > 1){
    while(count < record-1 && count < list_size){
        printf("
Inside while count %d node %s head %s",count, node->name, head->name);
        node = temp;
        temp = temp->next;
        node->next = temp->next;
        count++;
    }
    printf("
Outside while temp %s node %s head %s",temp->name,node->name,head->name);
    free(temp);
}
答案

那么代码中有些地方可能会导致访问NULL值,导致调用未定义的行为。

node = head;
temp = head;
if( head == NULL){
    fprintf(stderr,"List is empty");
    exit(1);
}
if(record == 1){

    head=head->next;
    printf("
Inside if count %d node %s head %s",count, node->name, head->name);
    free(node);
}
else if (record > 1){
    for(size_t i = 1; i < record && temp != NULL; i++){
       node = temp;
       temp = temp -> next;
    }
    if( temp )
        node->next = temp->next;
    free( temp );
}

对于这样的编写方法,请尝试使用指针。这里不需要全局变量。之前您的代码有一些冗余的赋值语句,它们没有做任何有意义的事情。

一个完整的例子就是这样的

struct Node* deleteNth (struct Node *head, int N){
    struct Node *t ;
    if(head == NULL){
        fprintf(stderr, "%s
", "List is empty");
        exit(1);
    }
    if( N <= 0){
        fprintf(stderr, "%s
", "Position given wrong");
        exit(1);
    }
    if( N == 1){
        t = head;
        head = head->next;
        free(t);
        return head;
    }

    struct Node *p = t;
    int i;

    for(i = 1; i < N && t!=NULL; i++){
        p = t;
        t = t->next;
    }
    if( t == NULL ){
        fprintf(stderr,"%s
","Insuffiecient Number of elements" );
        exit(1);
    }
    if( t!= NULL ){
        p->next = t->next;
    }
    free(t);
    return head;
}

以上是关于从链接列表中删除节点无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

单链接列表删除

带有复选框和自定义适配器的 ListView,片段无法正常工作

ScrollView 在选项卡式活动中无法正常工作

无法弄清楚如何通过仅使用类的函数删除整个链接列表

不能只删除链接列表中的最后一个元素! (所有其他具有特定值的元素都会被删除)

“从链接列表中删除循环”中的运行时错误