从链表中删除节点不能正常工作

时间:2017-12-20 20:01:09

标签: c linked-list

尝试从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);
}

1 个答案:

答案 0 :(得分: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;
}