链表尾部插入新节点后显示垃圾值,求助问题排查与解决
问题分析与解决方案
你的代码出现垃圾值的核心原因有两个:
1. createList 函数多创建了一个未初始化的空节点
在createList的循环中,你给每一个节点(包括最后一个有效节点)都创建了下一个节点,最终导致链表末尾多了一个未赋值的空节点。插入新节点时,这个空节点会被当作链表的最后一个节点,新节点被接在它后面。当display遍历到这个空节点时,就会输出垃圾值。
修正后的createList函数:
void createList(st *head) { st *p; p = head; int i = 0; char x = ' '; printf("Enter number of nodes: "); scanf("%d", &n); scanf("%c", &x); for (i = 1; i <= n; i++) { printf("Enter name: "); gets(head->name); printf("Enter roll number: "); scanf("%d", &(head->roll)); scanf("%c", &x); // 仅当不是最后一个节点时,才创建下一个节点 if (i != n) { head->next = (st *)malloc(sizeof(st)); head = head->next; } } // 最后一个有效节点的next设为NULL,标志链表结束 head->next = NULL; }
2. display函数的循环条件错误
原display函数的循环条件是while (head->next != NULL),这意味着只有当当前节点的下一个节点存在时,才会显示当前节点。虽然在初始情况下能正常显示(因为最后一个有效节点的下一个是空节点),但插入新节点后,空节点的下一个是新节点,导致空节点被错误地显示出来。
修正后的display函数:
void display(st *head) { // 遍历直到当前节点为NULL,确保所有有效节点都被显示 while (head != NULL) { printf("\nName\t\t:\t%s", head->name); printf("\nRoll no.\t:\t%d", head->roll); head = head->next; } }
额外建议:替换不安全的gets函数
gets函数存在缓冲区溢出风险,建议使用fgets替代,并处理读取到的换行符:
// 替换gets(head->name)为: fgets(head->name, sizeof(head->name), stdin); // 去除fgets读取的换行符 head->name[strcspn(head->name, "\n")] = '\0';
修正后再运行代码,插入新节点后就能正常显示所有节点的数据了。
内容的提问来源于stack exchange,提问作者Rohan Nag
相关产品推荐
相关产品推荐

