链表clear_train函数删除首元素异常:空节点问题求助
解决你的clear_train函数空节点问题
嘿,我瞅了你的代码,问题其实出在两个地方——头节点删除后的指针更新和循环里的指针移动逻辑,咱们一步步说:
为啥会出现空节点?
你在main里调用clear_train(train,"Presov")后,没有把函数返回的新头节点赋值回train!而且原clear_train函数处理头节点删除的逻辑根本不对:
- 当要删的是第一个节点时,你的代码直接跳进了循环,虽然free了头节点,但main里的
train还是指着那块已经被释放的内存,print的时候自然就会出现“空节点”(其实是非法内存访问导致的乱码/空值)。 - 另外,循环里不管删没删节点,你都直接移动
prev_searcher和this_searcher,要是刚删了this_searcher,prev_searcher就会指向已经被free的节点,后续操作全是非法的。
修复后的代码
我给你改好了clear_train函数,同时修正main里的调用方式:
1. 修正clear_train函数
struct car* clear_train(struct car* first, const char* target) { // 空链表直接返回 if(first == NULL){ return NULL; } // 先专门处理头节点是目标的情况——可能要连续删多个头节点 while (first != NULL && strcmp(first->value, target) == 0) { struct car* temp = first; first = first->next; // 把新头节点存下来 free(temp); // 释放旧头 } // 如果处理完头节点后链表空了,直接返回 if (first == NULL) { return NULL; } // 处理中间和末尾的节点 struct car* prev_searcher = first; struct car* this_searcher = first->next; while (this_searcher != NULL){ if(strcmp(this_searcher->value, target) == 0){ // 找到目标,跳过它并释放 prev_searcher->next = this_searcher->next; free(this_searcher); // 删除后,this_searcher要跳到prev的下一个,不能直接往后移 this_searcher = prev_searcher->next; } else { // 没找到才移动指针 prev_searcher = this_searcher; this_searcher = this_searcher->next; } } return first; }
2. 修正main里的调用
你必须把clear_train返回的新头节点赋值给train,不然main里的指针还是旧的:
// 原来的写法:clear_train(train,"Presov"); // 改成下面这样: train = clear_train(train,"Presov");
测试效果
改完之后,运行main函数,输出就正常了:
Bratislava Levoca Spiska Nova Ves Bardejov Pichne
再也不会出现那个烦人的空节点啦。
内容的提问来源于stack exchange,提问作者Marek1639
相关产品推荐
相关产品推荐

