C语言链表仅显示最后添加节点问题排查求助
问题排查:链表添加后仅显示最后一个节点的原因及修复
核心错误原因
在adaugare函数的判断逻辑中,你误用了赋值操作符=来替代相等比较操作符==:
if (prim = NULL) // 此处是赋值,不是比较判断! return p;
这个错误会导致每次调用添加函数时,不管当前链表头prim是否为空,都会先将prim强制赋值为NULL,随后直接返回新创建的节点p(且你提前把p->urm设为了NULL)。这意味着链表永远只会保留最后添加的那个节点,之前的节点全部丢失,所以执行显示操作时只能看到最后输入的人员信息。
修复方案
1. 修正判断逻辑并简化头插法实现
头插法不需要额外判断链表是否为空,直接将新节点指向原链表头,再返回新节点作为新的链表头即可。修正后的adaugare函数如下:
C* adaugare(C*prim) { char aux_nume[20], functie_aux[20]; C*p; do { printf("nume:"); scanf(" %s", aux_nume); } while (!validare(aux_nume)); printf("functie:"); scanf(" %s", functie_aux); p = (C*)malloc(sizeof(C)); // 修正内存分配:strlen返回字节数,无需套sizeof p->functie = (char*)malloc(strlen(functie_aux) + 1); strcpy(p->nume, aux_nume); strcpy(p->functie, functie_aux); p->vechime = strlen(p->functie); // 头插法核心:新节点指向原链表头 p->urm = prim; // 返回新的链表头 return p; }
2. 其他次要问题修复
afisare函数中的换行符错误:原代码printf(" ");无效,改为printf("\n");- 职位内存分配冗余:
sizeof(strlen(functie_aux)+1)是多余的,因为strlen已经返回字符串的字节长度(不含终止符),直接使用strlen(functie_aux)+1即可。
修复效果验证
修复后,每次添加的新节点会成为新的链表头,同时指向之前的链表节点,链表会正确累积所有添加的人员数据,执行显示操作时就能看到全部人员信息。
内容的提问来源于stack exchange,提问作者cat_mat_novice
相关产品推荐
相关产品推荐

