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

问题描述 投票:-1回答:1

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

node=head;
temp=node->next;

if(record == 1){
    head=head->next;
    printf("\nInside 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("\nInside while count %d node %s head %s",count, node->name, head->name);
        node = temp;
        temp = temp->next;
        node->next = temp->next;
        count++;
    }
    printf("\nOutside while temp %s node %s head %s",temp->name,node->name,head->name);
    free(temp);
}
c linked-list
1个回答
0
投票

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

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

    head=head->next;
    printf("\nInside 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\n", "List is empty");
        exit(1);
    }
    if( N <= 0){
        fprintf(stderr, "%s\n", "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\n","Insuffiecient Number of elements" );
        exit(1);
    }
    if( t!= NULL ){
        p->next = t->next;
    }
    free(t);
    return head;
}
© www.soinside.com 2019 - 2024. All rights reserved.