C++链表插入节点失败,程序可运行但节点位置错误问题求助
链表插入位置错误问题修复
核心错误点
- insertion函数内局部变量
n未初始化,判断pos>n的合法性校验逻辑完全失效,需要先遍历获取链表实际长度再做位置校验。 - 插入节点的核心代码被错误放在for循环内部,会导致每次指针移动时重复执行插入操作,正确逻辑是先遍历到
pos-1对应的节点,循环结束后再执行一次插入操作即可。 - create函数内部重复接收用户输入的
n,覆盖了main函数传入的数组长度,会导致链表创建长度和输入的数组长度不匹配,容易触发数组越界。 - display函数输出节点值时没有添加分隔符,所有值会连续打印,无法直观判断插入结果是否正确。
- (优化项)标准C++不支持可变长度数组
int a[n]的写法,建议改用动态内存分配或vector容器存储输入的数组值。
修正后完整代码
#include<iostream> using namespace std; struct Node { int data; struct Node *next; }*HEAD=NULL; // 获取链表长度 int getLength(struct Node *p) { int len = 0; while(p != NULL) { len++; p = p->next; } return len; } void create(int a[],int n) { struct Node *p; for(int i=0;i<n;i++) { if(i==0) { HEAD=new Node; p=HEAD; p->data=a[0]; } else { p->next=new Node; p=p->next; p->data=a[i]; } p->next=NULL; } } void insertion(struct Node *p,int pos,int x) { struct Node *t; int i; int len = getLength(p); if(pos<0||pos>len) { cout<<"Invalid position "<<endl; return; } t=new Node; t->data=x; if(pos==0) { t->next=HEAD; HEAD=t; } else { for(i=0;i<pos-1;i++) { p=p->next; } t->next=p->next; p->next=t; } } void display(struct Node *HEAD) { struct Node *p; p=HEAD; while(p!=NULL) { cout<<p->data<<" "; p=p->next; } cout<<endl; } int main() { int n; cout<<"enter the value of n "<<endl; cin>>n; int *a = new int[n]; cout<<"Array elements are "<<endl; for(int i=0;i<n;i++) { cin>>a[i]; } create(a,n); insertion(HEAD,1,15); display(HEAD); delete[] a; return 0; }
内容的提问来源于stack exchange,提问作者Rohan Shahi
相关产品推荐
相关产品推荐

