| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1220 人关注过本帖
标题:[求助]链表问题
只看楼主 加入收藏
comebaby
Rank: 1
等 级:新手上路
帖 子:85
专家分:0
注 册:2006-6-17
收藏
得分:0 

晕噢!!! 发错了程序~不过两个程序也差不多一样的`~ 这个程序才是让我满意一点的` 我用你们帮我修改的代码添加进去~~ 现在程序就是这样`~不过还是老问题~~唉~~~
#include <iostream>

using namespace std;

void gm()
{

cout<<"\n\n\n\t----------------------功能提示-----------------------\n";
cout<<"\t 1.在学生成绩表中,插入一名学生的信息,请输入“1”.\n";
cout<<"\t 2.查看一名学生的相关信息,请输入“2”.\n";
cout<<"\t 3.删除一名学生的所有信息,请输入“3”.\n";
cout<<"\t 4.查看学生成绩表中,所有学生的信息,请输入“4”.\n";
cout<<"\t 5.删除整个学生成绩表,请输入“5”.\n";
cout<<"\t 6.退出功能选项,请输入“6”.\n";
cout<<"\t-------------------------------------------------------\n\n\n";

}

void xsxcts() /*学生信息输入提示*/
{
cout<<"\n\t----------------------学生信息输入提示-----------------------\n";
cout<<"\t 1.输入的学号必须在20位数以内.\n";
cout<<"\t 2.输入的学生成绩不得小于0分或都大于120分.\n";
cout<<"\t 3.输入完一个项目时,请按回车,以便对下一信息的输入.\n";
cout<<"\t 4.输入“exit”,则结束对学生的相关信息的输入.\n\n";
cout<<"\t 例如:\n";
cout<<"\t 请输入第1学生的学号:1001 回车\n";
cout<<"\t 请输入第1学生的姓名:王明 回车\n";
cout<<"\t 请输入第1学生的数学成绩:80 回车\n";
cout<<"\t 请输入第1学生的英语成绩:90 回车\n";
cout<<"\t 请输入第2学生的学号:1003 回车\n";
cout<<"\t 请输入第2学生的姓名:小刚 回车\n";
cout<<"\t 请输入第2学生的数学成绩:70 回车\n";
cout<<"\t 请输入第2学生的英语成绩:80 回车\n";
cout<<"\t | \n";
cout<<"\t | \n";
cout<<"\t 请输入第N学生的学号:exit 回车\n";
cout<<"\t--------------------------------------------------------------\n\n\n";
}


struct student
{
char no[100];
char name[100];
int math,eng;
double ave;
struct student *next;
};

student *jlxslb() /*建立学生成绩链表*/
{
student *head,*p,*pt;
char no[20],a[5]="exit";
int j=1,f,h;
xsxcts(); /*学生信息输入提示*/
cout<<"--------------------------------------------------------------\n";
head=0;
cout<<"请输入第"<<j<<"学生的学号:";
cin>>no;
f=strlen(no);
while(f>20)
{
cout<<"你输入的学号长度,超过了规定的范围内!!\n请重新输入该学生的学号:";
cin>>no;
f=strlen(no);
}
if(strcmp(no,a)==0)
{
cout<<"\n\n\t--------------学生成绩表为空--------------\n\n";
exit(0);
}
while(strcmp(no,a)!=0)
{
p=new student;
strcpy(p->no,no);
cout<<"请输入第"<<j<<"学生的姓名:";
cin>>p->name;
h=strlen(p->name);
while(h>8)
{
cout<<"你输入的学生姓名,超过了规定的范围内!!\n请重新输入该学生的姓名:";
cin>>p->name;
h=strlen(p->name);
}
cout<<"请输入第"<<j<<"学生的数学成绩:";
cin>>p->math;
while(p->math<0||p->math>120)
{
cout<<"-----你输入的数学成绩有误!!请重新输入!!-----\n";
cout<<"请输入该学生的数学成绩:";
cin>>p->math;
}
cout<<"请输入第"<<j<<"学生的英语成绩:";
cin>>p->eng;
while(p->eng<0||p->eng>120)
{
cout<<"-----你输入的英语成绩有误!!请重新输入!!-----\n";
cout<<"请输入第该学生的英语成绩:";
cin>>p->eng;
}

if(head==0)
{
head=p;
pt=p;
}
else
{
pt->next=p;
pt=p;
}
cout<<"请输入第"<<++j<<"学生的学号:";
cin>>no;
f=strlen(no);
while(f>20)
{
cout<<"你输入的学号长度,超过了规定的范围内!!\n请重新输入该学生的学号:";
cin>>no;
f=strlen(no);
}
}
cout<<"--------------------------------------------------------------\n";
pt->next=0;
return head;
}

student *jsxscj(student *head) /*计算学生成绩的平均分*/
{
student *p=head;
while(p!=0)
{
p->ave=(p->math+p->eng)/2.0;
p=p->next;
}
return head;
}


void scxslb(student *head) /*输入所有学生的信息*/
{
student *p=head;
cout<<"\n\n\t\t\t学生成绩表\n";
cout<<"\t学号"<<"\t姓名"<<"\t数学"<<"\t英语"<<"\t平均分\n";
while(p!=0)
{
cout<<"\t"<<p->no<<"\t"<<p->name<<"\t "<<p->math<<"\t "<<p->eng<<"\t "<<p->ave<<endl;
p=p->next;
}
}


student *crxsxc(student *head) /*插入一名学生信息*/
{
student *p,*x;
char no[100];
int f,h;
x=new student;
cout<<"请输入该学生的学号:";
cin>>x->no;
f=strlen(x->no);
while(f>20)
{
cout<<"你输入的学号长度,超过了规定的范围内!!\n请重新输入该学生的学号:";
cin>>x->no;
f=strlen(x->no);
}
cout<<"请输入该学生的姓名:";
cin>>x->name;
h=strlen(x->name);
while(h>8)
{
cout<<"你输入的学生姓名,超过了规定的范围内!!\n请重新输入该学生的姓名:";
cin>>x->name;
h=strlen(x->name);
}
cout<<"请输入该学生的数学成绩:";
cin>>x->math;
while(x->math<0||x->math>120)
{
cout<<"-----你输入的数学成绩有误!!请重新输入!!-----\n";
cout<<"请输入该学生的数学成绩:";
cin>>x->math;
}
cout<<"请输入该学生的英语成绩:";
cin>>x->eng;
while(x->eng<0||x->eng>120)
{
cout<<"-----你输入的英语成绩有误!!请重新输入!!-----\n";
cout<<"请输入第该学生的英语成绩:";
cin>>x->eng;
}
x->ave=(x->math+x->eng)/2.0;
p=head;
cout<<"*********请输入你想在那位学生的学号后插入该学生的信息:";
cin>>no;
while(p!=0)
{
if(strcmp(p->no,no)==0)
{
x->next=p->next;
p->next=x;
scxslb(head); /*输入所有学生的信息*/
return head;
}
p=p->next;
}
cout<<"\n*********没有该学生的学号或者你的输入有误*********\n";
return head;
}

student *ckxsxc(student *head) /*查看一名学生信息*/
{
student *p;
int f;
char no[100];
cout<<"请输入你要查看学生的学号:";
cin>>no;
f=strlen(no);
if(f>20)
{
cout<<"**********你输入的学号长度,超过了规定的范围内**********\n";
return head;
}
p=head;
while(p!=0)
{
if(strcmp(p->no,no)==0)
{
cout<<"\t学号"<<"\t姓名"<<"\t数学"<<"\t英语"<<"\t平均分\n";
cout<<"\t"<<p->no<<"\t"<<p->name<<"\t "<<p->math<<"\t "<<p->eng<<"\t "<<p->ave<<endl;
return head;
}
p=p->next;
}
cout<<"**********没有你要查看学生的学号,或者你的输入有误*********\n";
return head;
}

student *scxsc(student *head) /*删除一名学生信息*/
{
student *pa,*pc;
int f;
char no[100];
cout<<"请输入你要删除学生的学号:";
cin>>no;
f=strlen(no);
if(f>20)
{
cout<<"**********你输入的学号长度,超过了规定的范围内**********\n";
return head;
}
pa=pc=head;
if(strcmp(pc->no,no)==0)
{
head=pc->next;
}
while((pc!=NULL)&&(strcmp(pc->no,no)!=0))
{
pa=pc;
pc=pc->next;
}
if(pc==NULL)
{
cout<<"\n******没有该学生的学号或者你的输入有误!******\n";

}
else
{
pa->next=pc->next;
delete pc;
}
return head;
}

void scxscjb(student *head) /*删除学生成绩表*/
{
student *p;
p=head;
while(head)
{
head=p->next;
delete p;
p=head;
}
cout<<"\n\n*********学生成绩表以为空*********\n\n";
exit (0);
}

int main(void)
{
student *head;
char i;
head=jlxslb(); /*建立学生成绩链表*/
jsxscj(head); /*计算学生成绩的平均分*/
scxslb(head); /*输入所有学生的信息*/
gm();
cout<<"请选择功能:";
cin>>i;
if(i=='6')
exit(0);
while(!(i>'0'&&i<'6'))
{
cout<<"\n-------你输入的功能值有误,请参考《功能提示》-------\n请选择功能:";
cin>>i;
}
while(i!='6')
{
if(i=='1')
crxsxc(head); /*插入一名学生信息*/
if(i=='2')
ckxsxc(head); /*查看一名学生信息*/
if(i=='3')
{
scxsc(head); /*删除一名学生信息*/
scxslb(head); /*输入所有学生的信息*/
}
if(i=='4')
scxslb(head); /*查看所有的学生信息*/
if(i=='5')
scxscjb(head); /*删除学生成绩表*/
cout<<"请选择功能:";
cin>>i;
if(i=='6')
exit(0);
while(!(i>'0'&&i<'6'))
{
cout<<"\n-------你输入的功能值有误,请参考《功能提示》-------\n请选择功能:";
cin>>i;
}
}
getchar();
return 0;
}

2006-06-19 07:33
comebaby
Rank: 1
等 级:新手上路
帖 子:85
专家分:0
注 册:2006-6-17
收藏
得分:0 
忘记加一个p->next=NULL
while(strcmp(no,a)!=0)
{
p=new student;
p->next=NULL;
strcpy(p->no,no);
cout<<"请输入第"<<j<<"学生的姓名:";
cin>>p->name;
h=strlen(p->name);
while(h>8)
{
cout<<"你输入的学生姓名,超过了规定的范围内!!\n请重新输入该学生的姓名:";
cin>>p->name;
h=strlen(p->name);
}
2006-06-19 07:36
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 
谢谢了,我发现有时候改一个人代码比写还困难

嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-06-19 20:24
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
有时候是这样,这样可以提升能力,但有时候,旁观者清,特别是很简单的错误,我老是看不到,都是aogun帮我指出的

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-06-20 09:23
comebaby
Rank: 1
等 级:新手上路
帖 子:85
专家分:0
注 册:2006-6-17
收藏
得分:0 

版主`~
加一个detele 程序崩溃是什么原因``
要是不加 为什么删除不了第一个学生的学号~

student *scxsc(student *head) /*删除一名学生信息*/
{
student *pa,*pc;
int f;
char no[100];
cout<<"请输入你要删除学生的学号:";
cin>>no;
f=strlen(no);
if(f>20)
{
cout<<"**********你输入的学号长度,超过了规定的范围内**********\n";
return head;
}
pa=pc=head;
if(strcmp(pc->no,no)==0)
{

head=pc->next;
delete pc;
}
while((pc!=NULL)&&(strcmp(pc->no,no)!=0))
{
pa=pc;
pc=pc->next;
}
if(pc==NULL)
{
cout<<"\n******没有该学生的学号或者你的输入有误!******\n";

}
else
{
pa->next=pc->next;
delete pc;
}
return head;
}

2006-06-21 07:43
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
以下是引用comebaby在2006-6-21 7:43:59的发言:

版主`~
加一个detele 程序崩溃是什么原因``
要是不加 为什么删除不了第一个学生的学号~

student *scxsc(student *head) /*删除一名学生信息*/
{
student *pa,*pc;
int f;
char no[100];
cout<<"请输入你要删除学生的学号:";
cin>>no;
f=strlen(no);
if(f>20)
{
cout<<"**********你输入的学号长度,超过了规定的范围内**********\n";
return head;
}
pa=pc=head;
if(strcmp(pc->no,no)==0)
{

head=pc->next;
delete pc; //你这里delete以后,pc就是迷途指针,往下看。
//(先看其他解释,最后看这里)所以建议这里加一条语句
return head;
}
while((pc!=NULL)&&(strcmp(pc->no,no)!=0)) // 这里pc是指向一个未知的地址
//所以pc!=NULL,strcmp(pc->no,no)!=0,那么现在的迷途指针也进入了循环
//当然会有问题

{
pa=pc;
pc=pc->next;
}
if(pc==NULL)
{
cout<<"\n******没有该学生的学号或者你的输入有误!******\n";

}
else
{
pa->next=pc->next;
delete pc;
}
return head;
}


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-06-21 08:11
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 

晕了LZ
你害苦我了我找半天也没找到哪里错了
为什么head到主函数就变了
后来才想到最后一种可能,你忘写东西了
while(strcmp(i,s0)>0&&strcmp(i,s6)<0)
{
if(strcmp(i,s1)==0)
crxsxc(head); /*插入一名学生信息*/
if(strcmp(i,s2)==0)
ckxsxc(head); /*查看一名学生信息*/
if(strcmp(i,s3)==0)
head= scxsc(head); /*删除一名学生信息*///你要是没有返回,因为名字空间
//就不会保存你改过的head这里还是原始申请的head,而原始的已经删了
if(strcmp(i,s4)==0)
scxslb(head); /*查看所有的学生信息*/
if(strcmp(i,s5)==0)
scxscjb(head); /*删除学生成绩表*/
cout<<"请选择功能:";
cin>>i;
你这个错误累死我了,没想到这你也错
我昨天只测试了几次删除中间的,所以没涉及到head,所以没有错通过就发过来了
这下把这改了就好了


嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-06-21 14:10
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 
呵呵 wfpb
看糊涂拉
return之后就退出这个函数拉
再进这个函数时pc就不是那个pc了
pa=pc=head;
呵呵 看来咱们要是不看全代码都会出错
另外,楼主你昨天给我改的地方
我根本都没看那里,因为你说你删除的错了

嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-06-21 14:16
feng1256
Rank: 4
等 级:贵宾
威 望:14
帖 子:2899
专家分:0
注 册:2005-11-24
收藏
得分:0 

楼主的代码和C没太大区别

代码正确性先不管!
首先变量,函数起名要望文生义(不是拼音
然后要规范!这样写下来就没什么大问题了

链表这里好好理解它的内存逻辑结果,操作的时候时刻想着就没什么大问题

song4:我以后来你这里混


叁蓙大山:工謪、稅務、嗣發 抱歉:不回答女人的问题
2006-06-21 14:21
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 
............
怎么了,抢生意呀
我们这里高手如云,一般不出来,就我一个小锣丘

嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-06-21 14:31
快速回复:[求助]链表问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026312 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved