C语言链表创建程序运行异常,仅可打印头节点无后续节点输出
错误根因
createLinkedList函数else分支的尾节点查找逻辑存在问题:
- 原代码中
while(p != NULL) p = p->next;的遍历终止条件错误,循环结束后指针p会指向NULL,此时执行p = temp仅修改了局部指针变量p本身的存储值,并未修改链表最后一个节点的next指针,新节点完全没有挂载到原有链表上,因此除头节点外其余节点均和链表断开关联,遍历的时候自然只能输出头节点。
修复方案
修改else分支的逻辑,调整遍历终止条件,让循环结束时p指向链表当前的最后一个有效节点,再将新节点赋值给该节点的next指针即可,修改后的createLinkedList函数代码如下:
void createLinkedList(int n) { int i; struct Node *temp, *p; for(i=1; i<=n; i++) { temp = (struct Node *)malloc(sizeof(struct Node)); printf("Now enter your element %d of linked list: ",i); scanf("%d",&(temp->data)); temp->next = NULL; if(head == NULL) head = temp; else { p = head; // 调整终止条件:遍历到当前最后一个节点就停止 while(p->next != NULL) p = p->next; // 将新节点挂到最后一个节点的next指针上 p->next = temp; } printf("\n"); } }
可选优化
当前代码每次插入新节点都要从头遍历链表找尾节点,时间复杂度为O(n²),如果链表较长效率较低,可以额外维护一个全局或局部的尾指针,每次插入新节点后更新尾指针,插入操作时间复杂度可以降到O(1)。
内容的提问来源于stack exchange,提问作者nSack
相关产品推荐
相关产品推荐

