从链接列表中删除节点无法正常工作
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,片段无法正常工作