c++中链表插入问题
一个单链表,要求在值为“jone”的结点前插入值为“marit”的结点,若没有值为“jone”的结点,则插在链表最后。请帮我看下下面的程序:当有jone这个结点时,程序可以输出正确结果,没有jone结点,要插入在链表末尾时,程序跳到调试状态了,是什么原因?
#include <iostream.h>
#include <string.h>
struct Node
{
char a[20];
Node* next;
};
void insert(Node* head);
void main()
{
Node* head;
Node* x1=new Node;
strcpy(x1->a,"hello");
head=x1;
x1->next=NULL;
Node* x2=new Node;
strcpy(x2->a,"jone");
x1->next=x2;
x2->next=NULL;
Node* x3=new Node;
strcpy(x3->a,"good");
x2->next=x3;
x3->next=NULL;
Node* x4=new Node;
strcpy(x4->a,"better");
x3->next=x4;
x4->next=NULL;
cout<<"插入之前"<<endl;
Node* p=new Node();
for(p=head;p;p=p->next)
{
cout<<p->a<<"->";
}
cout<<'0'<<endl;
insert(head);
cout<<"插入之后:"<<endl;
for(Node* p1=head;p1;p1=p1->next)
{
cout<<p1->a<<"->";
}
cout<<'0'<<endl;
}
void insert(Node* head)
{
Node* p=new Node();
strcpy(p->a,"marit");
Node* p1=head;
while(strcmp(p1->next->a,"jone")!=0 && p1->next)
{
p1=p1->next;
}
if(p1->next==NULL)
{
p1->next=p;
p->next=NULL;
}
else
{
p->next=p1->next;
p1->next=p;
}
}
[解决办法]
void insert(Node* head){ Node* p=new Node(); strcpy(p->a,"marit"); Node* p1=head; while(p1->next && strcmp(p1->next->a,"jone")!=0) /*将条件p1->next前置,避免出现空指针下的->a*/ { p1=p1->next; } if(p1->next==NULL) { p1->next=p; p->next=NULL; } else { p->next=p1->next; p1->next=p; }}
[解决办法]
将while(strcmp(p1->next->a,"jone")!=0 && p1->next)
改成
while(p1->next && strcmp(p1->next->a,"jone")!=0)
你的循环条件是当p1->next为空时,还调用空指针,自然报错。