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

需要帮忙的是------------------红色的那段函数
我需要解决的问题------------注释是用蓝色的那里
我只想把这程序做得完美一点,太垃圾了,不要笑我噢,偶的心灵太弱小了

谢谢~~~~~~~~~~谢谢~~~~~~~~



#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 *p,*pc;
int f;
char no[100];
cout<<"请输入你要删除学生的学号:";
cin>>no;
f=strlen(no);
if(f>20)
{
cout<<"**********你输入的学号长度,超过了规定的范围内**********\n";
return head;
}
p=pc=head;
if(strcmp(p->no,no)==0)
{
head=p->next;
delete p; /*使用这条语句时,在执行别的功能,程序崩溃; 若不使用这条语句,执行别的功能时,
删除的第一位学生信息,还会显示出来*/
scxslb(head); /*输入所有学生的信息*/
return head;
}

while(p!=0)
{
if(strcmp(p->no,no)==0)
{
p->next=p->next->next; /*我要删除指定的一位学生的信息,但它删除的是下一位学生的信息.请在不改动该函数的格式下
帮我使用其他的方法看一下,谢谢了啵*/


scxslb(head); /*输入所有学生的信息*/
return head;
}
p=p->next;

}

cout<<"\n******没有该学生的学号或者你的输入有误!******\n";
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[1];
char s0[2]="0",s1[2]="1",s2[2]="2",s3[2]="3",s4[2]="4",s5[2]="5",s6[2]="6";
head=jlxslb(); /*建立学生成绩链表*/
jsxscj(head); /*计算学生成绩的平均分*/
scxslb(head); /*输入所有学生的信息*/
gm();
cout<<"请选择功能:";
cin>>i;
if(strcmp(i,s6)==0)
{
cout<<"\t\t*********你已退出功能选项*********\n";
exit(0);
}
while((strcmp(i,s0)<0)||(strcmp(i,s6)>0))
{
cout<<"\n-------你输入的功能值有误,请参考《功能提示》-------\n请选择功能:";
cin>>i;
}
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)
scxsc(head); /*删除一名学生信息*/
if(strcmp(i,s4)==0)
scxslb(head); /*查看所有的学生信息*/
if(strcmp(i,s5)==0)
scxscjb(head); /*删除学生成绩表*/
cout<<"请选择功能:";
cin>>i;
if(strcmp(i,s6)==0)
{
cout<<"\t\t*********你已退出功能选项*********\n";
exit(0);
}
while((strcmp(i,s0)<0)||(strcmp(i,s6)>0))
{
cout<<"\n-------你输入的功能值有误,请参考《功能提示》-------\n请选择功能:";
cin>>i;
}
}
getchar();
return 0;
}

搜索更多相关主题的帖子: 链表 
2006-06-17 11:17
comebaby
Rank: 1
等 级:新手上路
帖 子:85
专家分:0
注 册:2006-6-17
收藏
得分:0 

偶把它改成下面这样子


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)
{
pc=pc->next;
head=pc;
delete pc; /*使用这条语句时,在执行别的功能,程序崩溃; 若不使用这条语句,执行别的功能时,
删除的第一位学生信息,还会显示出来*/


scxslb(head); /*输入所有学生的信息*/
return head;
}

else
{
while(strcmp(pc->no,no)!=0)
{
pa=pc;
pc=pc->next;
}
if(pc==NULL)
{
cout<<"\n******没有该学生的学号或者你的输入有误!******\n";
return head;
} /*当输入一个不存在的学号时,这复合语句执行不了*/
else
{
pa->next=pc->next;
delete pc;
scxslb(head); /*输入所有学生的信息*/
return head;
}
}
}

2006-06-17 11:26
Satyr
Rank: 1
等 级:新手上路
帖 子:83
专家分:0
注 册:2006-4-7
收藏
得分:0 

head=pc->next;
delete pc;
/*使用这条语句时,在执行别的功能,程序崩溃; 若不使用这条语句,执行别的功能时,
删除的第一位学生信息,还会显示出来*/

思路好不清晰
else
{
while(strcmp(pc->no,no)!=0)
{
pa=pc;没有用
pc=pc->next;
}
这是废话,上面IF不成立,就是while条件。
if(pc==NULL)
把尾节点当NULL了么
while(strcmp(pc->no,no)!=0&&pc!=NULL)加个条件

下面的else去掉


C++的博大精深让我叹服
2006-06-17 11:43
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
为什么C类型的程序看起来就是不舒服啊~!这个链表我不喜欢,我喜欢分开
class Student
{
...
};

struct Cnode
{
Student stu;
Cnode *next;
};

即简单,有通俗

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

偶是第一次自学的`~ 现在学到类的继承~ 不过没有老师教~~不怎么懂得灵活用运`~这几天我想把程序做得完善一点`~
在把这程序转换为类的格式`以前我们学过c语言,不过学校只让我们学了一个学期,就学了c语言前面六章(学到数组那里),后来自己就自学,凭着老师教的那点基础,我学完了C语言,现在转业自学C++了,不过见课本学链表那文章说得太垃圾了``只提了一点点`~自己就想巩固一下这章的知识~所以就编了自己第一次这么长的程序~我知道这程序还可以简化的,程序长并不是件好事;本来这程序我以前是做好了的``不过放在MP3里面,忘了存入电脑里面,后来MP3崩溃了,用了半个月的课余时间写的这程序代码也不见了,还有里面一些收积来的编程资料全不见了,人都有点崩溃了,后面想想只有一切在重新来过,才能补回来;现在就是那段函数,解决不了了,脑子没有以前那样灵活了,我知道可能是最近想这方面太多了,所以现在只能传上来,请求各位帮帮忙了;我也加有几个C++讨论QQ群,发到那里,请求帮且时,别人都是爱理不理的,根本没有人理我,大概是不熟悉吧!伤心啊!  
  我想和我一样自学的朋友们,都希望在自己遇到问题时,请求别人帮助,
  会有个高手指点一下我们,或者带一下我们
不好意思噢!这几天实在太郁闷了!在这里哆嗦了几句心里话!抱歉抱歉!

言归正传__
head=pc->next;
delete pc;
/*使用这条语句时,在执行别的功能,程序崩溃; 若不使用这条语句,执行别的功能时,
删除的第一位学生信息,还会显示出来*/

思路好不清晰
else
{
while(strcmp(pc->no,no)!=0)
{
pa=pc;没有用
pc=pc->next;
}
这是废话,上面IF不成立,就是while条件。
if(pc==NULL)
把尾节点当NULL了么
while(strcmp(pc->no,no)!=0&&pc!=NULL)加个条件

下面的else去掉
              改了,还是不对,在删除链表中不存在的学号时,程序还是崩溃,有QQ么,在QQ里面让我用"远程协助",操作让你看一下,或许那样子,你就清楚我的思路,和我要解决的问题了;

2006-06-18 09:48
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 

正好我们班有这个作业,我前天做的,给你看看吧
///////////////////////////////////////////
// mylist.h--链表头文件
//////////////////////////////////////////
#ifndef LIST_H
#define LIST_H
#include <iostream>
#include <iomanip>
using namespace std;
template<class T>
struct CNode
{
T info;
CNode<T> *next;
};

template<class T>
class CList
{
CNode<T> *tail; //表尾指针
CNode<T> *head; //表头指针
public:
CList(){tail=head=NULL;}
~CList(){Destroy();}
void Destroy()
{
while(head!=NULL)
{
CNode<T>*node=head;
head=head->next;
delete node;
}
}
bool isInside(T &inform)
{
CNode<T>*newNode=head;
while(newNode!=NULL)
{
if(newNode->info==inform)return true;
newNode=newNode->next;
}
return false;
}
//查找
void Search(T &inform)
{
bool found=false;
CNode<T>*newNode=head;
while(newNode!=NULL)
{
if(newNode->info==inform)
{
cout<<newNode->info<<endl;
found=true;break;
}
newNode=newNode->next;
}
if(!found)cout<<"Not found !"<<endl;
//return false;
}
//插入---按顺序插入做法
void Insert(T &inform)
{
CNode<T>*newNode=new CNode<T>;
newNode->info=inform;
newNode->next=NULL;
if(head==NULL)//空表
head=tail=newNode;
else
{
tail->next=newNode;tail=newNode;
if(head->next==NULL)head->next=tail;
}
}
//删除
void Delete(T &inform)
{
bool found=false;
for(CNode<T>*newNode=head;newNode;)
{
if(newNode->info==inform)
{
head=head->next;//更新链表头
delete newNode;
newNode=head;
found=true; //找到该数据
break;
}
else newNode=newNode->next;
}
if(!found)cout<<"Cann't delete a nonentity information !"<<endl;
else cout<<"\n 删 除 成 功!"<<endl;
}
//输出数据
void Print()
{
system("cls");
cout<<setiosflags(std::ios::left)<<setw(8)<<"姓名"<<setw(8)<<"学号"<<setw(8)<<"英语"<<setw(8)<<"数学"<<setw(8)<<
"语文"<<setw(8)<<"总分"<<setw(8)<<"平均分"<<endl;
for(CNode<T>* cnode=head;cnode;cnode=cnode->next)cnode->info.print();
}
//退出并保存数据
void quitAndSave(ofstream &os)
{
for(CNode<T>*tempNode=head;tempNode!=NULL;tempNode=tempNode->next)os<<tempNode->info<<endl;
}
};
#endif //LIST_H


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

/////////////////////////////////////////
// student.h--自定义学生类头文件
////////////////////////////////////////

#ifndef CSTUDENT_H
#define CSTUDENT_H

#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;

class Cstudent
{
//---重载stream运算符---//
friend ostream& operator<<(ostream &os,const Cstudent& stu)
{
os<<"学 号: "<<stu.ID<<endl;
os<<"姓 名: "<<stu.name<<endl;
os<<"英 语: "<<stu.english<<endl;
os<<"数 学: "<<stu.math<<endl;
os<<"语 文: "<<stu.chinese<<endl;
os<<"总 分: "<<stu.english+stu.math+stu.chinese<<endl;
os<<"平均成绩: "<<(stu.english+stu.math+stu.chinese)/3<<endl;
return os;
}
friend istream& operator>>(istream &is,Cstudent& stu)
{
cout<<"输 入 学 生 学 号: ";is>>stu.ID;
cout<<endl<<"输 入 学 生 姓 名: ";is>>stu.name;
cout<<endl<<"输 入 英 语 成 绩: ";is>>stu.english;
cout<<endl<<"输 入 数 学 成 绩: ";is>>stu.math;
cout<<endl<<"输 入 语 文 成 绩: ";is>>stu.chinese;
return is;
}
friend ofstream& operator<<(ofstream &ous,const Cstudent& stu)
{
ous<<stu.ID<<" "<<stu.name<<" "<<stu.english<<" "<<stu.math<<" "<<stu.chinese<<endl;
return ous;
}
friend ifstream& operator>>(ifstream &ins,Cstudent& stu)
{
ins>>stu.ID>>stu.name>>stu.english>>stu.math>>stu.chinese;
return ins;
}
private:
float english,math,chinese;
char *ID,*name;
public:
//------静态成员-------
static int studentsNumber; //记录学生人数
static void addStuNumber(){studentsNumber++;} //更新学生人数
static void delStuNumber(){studentsNumber--;} //更新学生人数
//无参构造函数
Cstudent(){english=0;math=0;chinese=0;ID=new char[10];name=new char[10];}
//缺省构造函数
Cstudent(char *id,char *na=NULL,float e=0,float m=0,float c=0)
:english(e),math(m),chinese(c)
{
ID=new char[strlen(id)+1];
strcpy(ID,id);
if(na!=NULL)
{
name=new char[strlen(na)+1];
strcpy(name,na);
}
else name=NULL;
}
//拷贝构造函数
Cstudent(const Cstudent& stu)
{
delete ID;delete name;
english=stu.english;
math=stu.math;
chinese=stu.chinese;
ID=new char[strlen(stu.ID)+1];strcpy(ID,stu.ID);
name=new char[strlen(stu.name)+1];strcpy(name,stu.name);
}
//重载复值运算符
Cstudent &operator=(const Cstudent& stu)
{
delete ID;delete name;
english=stu.english;
math=stu.math;
chinese=stu.chinese;
ID=new char[strlen(stu.ID)+1];strcpy(ID,stu.ID);
name=new char[strlen(stu.name)+1];strcpy(name,stu.name);
return *this;
}
//析构函数
~Cstudent(){delete ID;delete name;}
bool operator==(const Cstudent &c){return !strcmp(ID,c.ID);}
void print(){cout<<setiosflags(std::ios::left)<<setw(8)<<ID<<setw(8)<<name<<setw(8)<<english<<setw(8)<<math<<setw(8)<<chinese
<<setw(8)<<english+math+chinese<<setw(8)<<(english+math+chinese)/3<<endl;}
};
#endif //CSTUDENT_H


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

/////////////////////////////////
// main.cpp -- main文件
/////////////////////////////////
#include <iostream>
#include <fstream>
#include <conio.h>
#include <windows.h>
#include "student.h"
#include "mylist.h"
using namespace std;

#define filename "C:\\StudentsInfo.txt"

CList<Cstudent> list;
ifstream ins;

int Cstudent::studentsNumber=0; //static变量
//fuction declare...
void getChoice();
void menu();
int main()
{
ins.open(filename);
if(ins.fail())
{
cout<<"没有任何数据信息!\n----添加新的信息----"<<endl;
Cstudent inf; cin>>inf;
list.Insert(inf);
cout<<"\n\nCongratunation!--插入成功--!"<<endl;
ofstream ous(filename);
ous<<inf;ous.close();
Cstudent::addStuNumber();
Sleep(1000);system("cls");
}
else
{
//所有数据压入链表
Cstudent aStudent;int i=0;
while(ins>>aStudent)
{
list.Insert(aStudent);
Cstudent::addStuNumber();
}
}
menu();
getChoice();
system("pause");
return 0;
}
void menu()
{
cout<<"学生总人数:"<<Cstudent::studentsNumber<<endl;
cout<<" *_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_"<<endl;
cout<<" 学 生 成 绩 管 理 系 统 (简易版 ) "<<endl;
cout<<" *_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_"<<endl;
cout<<endl;
cout<<"1. 查 找 学 生 信 息"<<endl<<endl;
cout<<"2. 插 入 学 生 信 息"<<endl<<endl;
cout<<"3. 删 除 学 生 信 息"<<endl<<endl;
cout<<"4. 显 示 所 有 学 生 信 息"<<endl<<endl;
cout<<"5. 退 出 并 保 存 信 息"<<endl<<endl;
cout<<"请选择...";
}
void getChoice()
{
int choice=getch()-'0';
switch(choice)
{
case 1:
cout<<"\n\n输入要查找学生的学号: ";char stuNum[10];cin>>stuNum;
list.Search(Cstudent(stuNum));
break;
case 2:{
cout<<endl<<endl;
Cstudent inform; cin>>inform;
if(!list.isInside(inform))
{
list.Insert(inform);
cout<<"插入成功!"<<endl;
Cstudent::addStuNumber();
}
else cout<<"\nSorry! You can't insert a exist data !"<<endl<<flush;
break;
}
case 3:{
cout<<"\n\n输入要删除学生的学号: ";char stu[10];cin>>stu;
list.Delete(Cstudent(stu));Cstudent::delStuNumber();
break;
}
case 4:list.Print();break;
case 5:{
ins.close();ofstream os(filename);
list.quitAndSave(os);os.close();
cout<<"quit"<<endl;break;
}
default:cout<<"Error choice --- Choice again!"<<endl;
}
if(choice!=5)
{
Sleep(3000);system("cls");
menu();
getChoice();
}
}


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-06-18 11:25
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分: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";
cout<<"请输入第"<<j<<"学生的学号:";
cin>>no;
head=0;
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;
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);
}
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;
delete pc; /*使用这条语句时,在执行别的功能,程序崩溃; 若不使用这条语句,执行别的功能时,
删除的第一位学生信息,还会显示出来*/

scxslb(head); /*输入所有学生的信息*/
return head;
}


while((pc!=NULL)&&(strcmp(pc->no,no)!=0))
{
pa=pc;
pc=pc->next;
}
if(pc==NULL)
{
cout<<"\n******没有该学生的学号或者你的输入有误!******\n";
return head;
} /*当输入一个不存在的学号时,这复合语句执行不了*/
else
{
pa->next=pc->next;
delete pc;
scxslb(head); /*输入所有学生的信息*/
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[1];
char s0[2]="0",s1[2]="1",s2[2]="2",s3[2]="3",s4[2]="4",s5[2]="5",s6[2]="6";
head=jlxslb(); /*建立学生成绩链表*/
jsxscj(head); /*计算学生成绩的平均分*/
scxslb(head); /*输入所有学生的信息*/
gm();
cout<<"请选择功能:";
cin>>i;
if(strcmp(i,s6)==0)
{
cout<<"\t\t*********你已退出功能选项*********\n";
exit(0);
}
while((strcmp(i,s0)<0)||(strcmp(i,s6)>0))
{
cout<<"\n-------你输入的功能值有误,请参考《功能提示》-------\n请选择功能:";
cin>>i;
}
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)
scxsc(head); /*删除一名学生信息*/
if(strcmp(i,s4)==0)
scxslb(head); /*查看所有的学生信息*/
if(strcmp(i,s5)==0)
scxscjb(head); /*删除学生成绩表*/
cout<<"请选择功能:";
cin>>i;
if(strcmp(i,s6)==0)
{
cout<<"\t\t*********你已退出功能选项*********\n";
exit(0);
}
while((strcmp(i,s0)<0)||(strcmp(i,s6)>0))
{
cout<<"\n-------你输入的功能值有误,请参考《功能提示》-------\n请选择功能:";
cin>>i;
}
}
getchar();
return 0;
}


嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-06-18 13:22
comebaby
Rank: 1
等 级:新手上路
帖 子:85
专家分:0
注 册:2006-6-17
收藏
得分:0 

还是出错``` 当执行一次删除第一个学生的学号时~~在执行"查看全部的学生信息"功能时`
程序崩溃`~
if(strcmp(pc->no,no)==0)
{
head=pc->next;
delete pc; /*使用这条语句时,在执行别的功能,程序崩溃; 若不使用这条语句,执行别的功能时,
删除的第一位学生信息,还会显示出来*/

scxslb(head); /*输入所有学生的信息*/
return head;
}


就差这一点了`~这程序就完善了``

2006-06-18 21:36
快速回复:[求助]链表问题
数据加载中...
 
   



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

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