求C++高手帮忙看段程序,运行到empty()函数时候总是出错

#include<iostream>
#include<iomanip>
using namespace std;
class score
{
public:
char name[10];
int num;
float math;
float chinese;
float english;
score *next;
};
score *head=NULL;
score *set()
{
int x;
score *p1,*p2;
p1=new score;
head=p1;
p2=p1;
cout<<"请输入人数:";
cin>>x;
for(int y=0;y<x;y++)
{
p1=new score;
p2->next=p1;
p2=p1;
cout<<"请输入姓名:";
cin>>p1->name;
cout<<"请输入学号:";
cin>>p1->num;
cout<<"请输入数学成绩:";
cin>>p1->math;
cout<<"请输入语文成绩:";
cin>>p1->chinese;
cout<<"请输入英语成绩:";
cin>>p1->english;
}
p2->next=NULL;
return head;
}
void show(score *p)
{
cout<<"姓名"<<setw(8)<<"学号"<<setw(8)<<"数学"<<setw(8)<<"语文"<<setw(8)<<"英语"<<endl;
while(p!=NULL)
{
cout<<p->name<<setw(8)<<p->num<<setw(8)<<p->math<<setw(8)<<p->chinese<<setw(8)<<p->english<<endl;
p=p->next;
}
}
void insert(score *p)
{
score *a=new score;
while(p->next!=NULL)
{
p=p->next;
}
p->next=a;
cout<<"请输入姓名:";
cin>>a->name;
cout<<"请输入学号:";
cin>>a->num;
cout<<"请输入数学成绩:";
cin>>a->math;
cout<<"请输入语文成绩:";
cin>>a->chinese;
cout<<"请输入英语成绩:";
cin>>a->english;
p=a;
p->next=NULL;
}
void empty(score *p)
{
int x;
score *a;
cout<<"请输入要删除成绩的学生学号"<<endl;
cin>>x;
while(p->num!=x&&p->next!=NULL)
{
a=p->next;
p=p->next;
}
if(p->num!=x)
{
cout<<"查无此人"<<endl;
}
if(p->num==x&&p->next!=NULL)
{
a=p->next;
delete p;
p=a;
cout<<"操作成功"<<endl;
}
if(p->next=NULL&&p->num==x)
{
delete p;
cout<<"操作成功"<<endl;
}
a=NULL;
}
int main()
{
head=set();
score *p=head->next;
show(p);
insert(p);
show(p);
empty(p);
show(p);
while(p!=NULL)
{
head=p;
p=p->next;
delete head;
}
return 0;
}
empty()函数用来删除数据的..不知道哪里出问题..就是执行不了...希望能把我思想误区一起说出来,我总感觉我链表哪里理解错误...小弟是初学者,如果有哪里怎么常识性错误,希望一起指出...拜托了..谢谢大家了..

#include<iostream>
#include<iomanip>
using namespace std;
class score
{
public:
char name[10];
int num;
float math;
float chinese;
float english;
score *next;
};
score *head=NULL;
score *set()
{
int x;
score *p1,*p2;
p1=new score;
head=p1;
p2=p1;
cout<<"请输入人数:";
cin>>x;
for(int y=0;y<x;y++)
{
p1=new score;
p2->next=p1;
p2=p1;
cout<<"请输入姓名:";
cin>>p1->name;
cout<<"请输入学号:";
cin>>p1->num;
cout<<"请输入数学成绩:";
cin>>p1->math;
cout<<"请输入语文成绩:";
cin>>p1->chinese;
cout<<"请输入英语成绩:";
cin>>p1->english;
}
p2->next=NULL;
return head;
}
void show(score *p)
{
cout<<"姓名"<<setw(8)<<"学号"<<setw(8)<<"数学"<<setw(8)<<"语文"<<setw(8)<<"英语"<<endl;
while(p!=NULL)
{
cout<<p->name<<setw(8)<<p->num<<setw(8)<<p->math<<setw(8)<<p->chinese<<setw(8)<<p->english<<endl;
p=p->next;
}
}
void insert(score *p)
{
score *a=new score;
while(p->next!=NULL)
{
p=p->next;
}
p->next=a;
cout<<"请输入姓名:";
cin>>a->name;
cout<<"请输入学号:";
cin>>a->num;
cout<<"请输入数学成绩:";
cin>>a->math;
cout<<"请输入语文成绩:";
cin>>a->chinese;
cout<<"请输入英语成绩:";
cin>>a->english;
p=a;
p->next=NULL;
}
void empty(score *p)
{
int x;
score *a,*b;//用于保留的b
b = p; //保留首
cout<<"请输入要删除成绩的学生学号"<<endl;
cin>>x;
while(p->num!=x&&p->next!=NULL)
{
p=p->next;
}
while(b->next!=p);//新添
if(p->num!=x)
{
cout<<"查无此人"<<endl;
}
if(p->num==x&&p->next!=NULL)
{
a=p->next;
b->next = a;
delete p;
p=a;
cout<<"操作成功"<<endl;
}
if(p->next==NULL&&p->num==x) //这儿粗心
{
delete p;
cout<<"操作成功"<<endl;
}
a=NULL;
b = NULL;
}
int main()
{
head=set();
score *p=head->next;
score *head = p;//改动之处只是为了保留首地址,你现在晓得你主要忘记的就是首地址这些链接上的问题,和地址传递上的问题,很好现在还在学习c,难得
show(head);
head = p;
insert(head);
head = p;
show(head);
head = p;
empty(head);
head = p;
show(head);
head = p;
while(head!=NULL)
{
head=p;
p=p->next;
delete head;
}
return 0;
}追问

按你说的那样改,在删除头一个节点时候,输入完会没反应了...
删除最后一个节点的时候会出现乱码..应该是我empty函数出问题吧...

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-09-02
它们都共用一个指针 当然会出错了
      不如这样吧.
     head=set();
score *p=head->next;//改成score *p=head->next, *pp;
pp=p;
show(pp);
pp=p;
insert(pp);
pp=p;
show(pp);
pp=p;
empty(pp);
pp=p;
show(pp);追问

按这样改后程序运行后如果删除第一个数据,会提示成功,但是下面会显示乱码..
删除最后一个数据,数据输出的时候还会保留删除掉的那个!

追答

那就是你的链表操作有问题

第2个回答  2011-09-02
指针错误
相似回答
大家正在搜