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