C++链表.docx
《C++链表.docx》由会员分享,可在线阅读,更多相关《C++链表.docx(21页珍藏版)》请在冰点文库上搜索。
C++链表
C++语言课程设计报告-------学生成绩简单管理程序
要求必须用C++语言
一、系统菜单的主要功能
(1)输入若干条记录
(2)显示所有记录
(3)按学号排序
(4)按姓名查找,删除一条记录
(5)输出统计信息(新增)
(6)从正文中添加数据到结构体数组中
(7)将所有数据写入文件中
(8)退出程序
提问者:
波音989-一级
其他回答 共1条
设计题目:
成绩管理系统
有学生成绩信息,内容如下
姓名学号语文数学英语
张明明01677882
李成友02789188
张辉灿03688256
王露04564577
陈东明05673847
….......…
A、功能要求:
(1)信息维护:
要求:
学生信息数据要以文件的形式保存,能实现学生信息数据的维护。
此模块包括子模块有:
增加学生信息、删除学生信息、修改学生信息
(2)信息查询:
要求:
查询时可实现按姓名查询、按学号查询
(3)成绩统计:
要求:
A输入任意的一个课程名(如数学)和一个分数段(如60--70),
统计出在此分数段的学生情况。
(4)排序:
能对用户指定的任意课程名,
按成绩升序或降序排列学生数据并显示排序结果(使用表格的形式显示排序后的输出结果)
以前做的一个程序,基本符合你的要求,你可以自己改一下。
---------Bykuaidh00---2008/01/07----------
**********************************************/
//链表的练习。
#include
#include
#include
#include
usingnamespacestd;
structList
{
stringm_Name;
stringm_ID;//可能有的学号里有字母,所以用string类型。
shortintm_Chinese;
shortintm_Match;
shortintm_English;
structList*Next;//指针域。
};
typedefstructListNode;
typedefNode*Link;
//---------------函数声明-------------------
LinkCreate(LinkHead);
LinkSearch(LinkHead);
LinkSearch_front(LinkHead);
voidRelease(LinkHead);
voidDisplay(LinkHead);
voidDisplay_One(LinkHead);
voidDisplay(LinkHead,fstream&ofile);
LinkAddInfo(LinkHead);
LinkDelInfo(LinkHead);
LinkModify(LinkHead);
voidGrade_Stat(LinkHead);
LinkSort(LinkHead);
//---------------函数实现-------------------
LinkCreate(LinkHead)
{
/*构造一个头节点*/
Head=(Link)newNode;
if(!
Head)
{
cout<<"分配内存失败。
"<exit(-1);
}
Head->m_Name="";
Head->m_ID="";
Head->m_Chinese=0;
Head->m_Match=0;
Head->m_English=0;
Head->Next=NULL;
returnHead;
}
LinkSearch(LinkHead)
{
cout<<"1.按姓名查询2.按学号查询"<intselect;
cin>>select;
while(cin.fail())
{
cout<<"请选择正确的菜单项:
";
cin.clear();
fflush(stdin);
cin>>select;
}
Linkptr;
ptr=Head;
if(select==1)
{
stringname;
cout<<"请输入要查询的姓名:
";
cin>>name;
while(ptr!
=NULL)
{
if(ptr->m_Name==name)
{
Display_One(ptr);
returnptr;
}
ptr=ptr->Next;
}
cout<<"没找到,怎么办?
"<}
elseif(select==2)
{
stringID;
cout<<"请输入要查询的学号:
";
cin>>ID;
while(ptr!
=NULL)
{
if(ptr->m_ID==ID)
{
Display_One(ptr);
returnptr;
}
ptr=ptr->Next;
}
cout<<"没找到,怎么办?
"<}
returnptr;
}
LinkSearch_front(LinkHead)
{//返回前驱节点。
cout<<"1.按姓名删除2.按学号删除"<intselect;
cin>>select;
while(cin.fail())
{
cout<<"请选择正确的菜单项:
";
cin.clear();
fflush(stdin);
cin>>select;
}
Linkptr;
Linkfront;
ptr=Head->Next;
front=Head;
if(select==1)
{
stringname;
cout<<"请输入要删除的姓名:
";
cin>>name;
while(ptr!
=NULL)
{
if(ptr->m_Name==name)
{
Display_One(ptr);
returnfront;
}
ptr=ptr->Next;
front=front->Next;
}
cout<<"没找到,怎么办?
"<}
elseif(select==2)
{
stringID;
cout<<"请输入要删除的学号:
";
cin>>ID;
while(ptr!
=NULL)
{
if(ptr->m_ID==ID)
{
Display_One(ptr);
returnfront;
}
ptr=ptr->Next;
front=front->Next;
}
cout<<"没找到,怎么办?
"<}
returnfront;
}
voidRelease(LinkHead)
{
Linkptr;
while(Head!
=NULL)
{
ptr=Head;
Head=Head->Next;
deleteptr;
}
}
voidDisplay(LinkHead)
{
Linkptr;
ptr=Head->Next;
cout<<"----------------------------------------------------------------------"<cout<<"----------------------------所有学生信息--------------------------"<cout<<"---姓名--------学号-----------语文-----------数学-----------英语------"<while(ptr!
=NULL)
{
cout<m_Name
<m_ID
<m_Chinese
<m_Match
<m_English<ptr=ptr->Next;
}
}
voidDisplay(LinkHead,fstream&ofile)
{
Linkptr;
ptr=Head->Next;
ofile<<"----------------------------------------------------------------------"<ofile<<"----------------------------所有学生信息--------------------------"<ofile<<"---姓名--------学号-----------语文-----------数学-----------英语------"<while(ptr!
=NULL)
{
ofile<m_Name
<m_ID
<m_Chinese
<m_Match
<m_English<ptr=ptr->Next;
}
}
voidDisplay_One(LinkHead)
{
Linkptr;
ptr=Head;
cout<<"----------------------------------------------------------------------"<cout<<"----------------------------查询结果信息--------------------------"<cout<<"---姓名--------学号-----------语文-----------数学-----------英语------"<cout<m_Name
<m_ID
<m_Chinese
<m_Match
<m_English<}
LinkAddInfo(LinkHead)
{
Linkptr;
ptr=Head;
while(ptr->Next!
=NULL)
{
ptr=ptr->Next;
}
Linkptr2;
charagain;
do
{
ptr2=(Link)newNode;
if(!
ptr2)
{
cout<<"内存分配失败!
"<exit(-1);
}
//数据域
stringName,ID;
shortintChinese,Match,English;
cout<<"输入姓名:
";
cin>>Name;
cout<";
cin>>ID;
cout<";
cin>>Chinese;
cout<";
cin>>Match;
cout<";
cin>>English;
ptr2->m_Name=Name;
ptr2->m_ID=ID;
ptr2->m_Chinese=Chinese;
ptr2->m_Match=Match;
ptr2->m_English=English;
//指针域
ptr2->Next=NULL;//作为尾节点。
ptr->Next=ptr2;//连接入链表。
ptr=ptr2;//将ptr2作为下一次产生的节点的前驱节点.
cout<<"是否继续输入?
(Y/N)";
cin>>again;
}while(again=='Y'||again=='y');
returnHead;
}
LinkDelInfo(LinkHead)
{
Linkptr;
Linkptr2;
ptr=Head;
Linkf_ptr;//前驱节点。
f_ptr=Search_front(ptr);
ptr2=f_ptr->Next;
f_ptr->Next=f_ptr->Next->Next;
deleteptr2;
returnHead;
}
LinkModify(LinkHead)
{
Linkptr;
ptr=Head;
ptr=Search(ptr);
cout<<"修改前信息为:
"<Display_One(ptr);
//cout<<"请选择你要修改的选项:
A:
姓名B:
学号C:
语文成绩D:
数学成绩E:
英语成绩"<stringname,ID;
floatChinese,Match,English;
cout<<"输入新姓名:
";
cin>>name;
cout<";
cin>>ID;
cout<";
cin>>Chinese;
cout<";
cin>>Match;
cout<";
cin>>English;
ptr->m_Name=name;
ptr->m_ID=ID;
ptr->m_Chinese=Chinese;
ptr->m_Match=Match;
ptr->m_English=English;
cout<"<Display_One(ptr);
returnHead;
}
voidGrade_Stat(LinkHead)
{//成绩统计。
Linkptr;
ptr=Head;
cout<<"请输入你要查询的课程名(chinese|match|english)和一个分数范围[min,max]."<stringname;
shortintmin,max;
intSwitchNum;
cout<<"课程名:
";
cin>>name;
cout<";
cin>>min;
cout<";
cin>>max;
if(name=="chinese")
SwitchNum=1;
elseif(name=="match")
SwitchNum=2;
elseif(name=="english")
SwitchNum=3;
else
{
cout<<"请输入一个正确的课程名:
"<return;
}
while(ptr!
=NULL)
{
switch(SwitchNum)
{
case1:
if(ptr->m_Chinese<=max&&ptr->m_Chinese>=min)
Display_One(ptr);
break;
case2:
if(ptr->m_Match<=max&&ptr->m_Match>=min)
Display_One(ptr);
break;
case3:
if(ptr->m_English<=max&&ptr->m_English>=min)
Display_One(ptr);
}
}
}
LinkSort(LinkHead)
{//我创建的是带头节点的链表。
用直接插入法。
cout<<"请输入你想排序的课程名(用中文):
";
stringcourse_name;
cin>>course_name;
if((Head->Next==NULL)||(Head->Next->Next==NULL))//此步条件判断非常有价值。
{
cout<<"数据节点数少于2个,不用排序!
"<returnHead;
}
//-----------第二步;
Linkptr;
Linkptr_F;
Linkptr_N;
ptr=Head->Next->Next;
ptr_F=Head;
Head->Next->Next=NULL;//到此,分成了两个链表。
//第三步。
while(ptr)
{
ptr_N=ptr->Next;
ptr_F=Head;//ptr_F的归位。
while(ptr_F->Next)
{
if(course_name=="语文")
{
if(ptr->m_Chinese>ptr_F->Next->m_Chinese)
{
ptr->Next=ptr_F->Next;
ptr_F->Next=ptr;
break;
}//if
else
{
ptr_F=ptr_F->Next;
}
}
if(course_name=="数学")
{
if(ptr->m_Match>ptr_F->Next->m_Match)
{
ptr->Next=ptr_F->Next;
ptr_F->Next=ptr;
break;
}//if
else
{
ptr_F=ptr_F->Next;
}
}
if(course_name=="英语")
{
if(ptr->m_English>ptr_F->Next->m_English)
{
ptr->Next=ptr_F->Next;
ptr_F->Next=ptr;
break;
}//if
else
{
ptr_F=ptr_F->Next;
}
}
}//while(ptr_F->Next)
if(ptr_F->Next==NULL)
{
ptr->Next=ptr_F->Next;
ptr_F->Next=ptr;//表示插到有序链表的最后面了。
}
ptr=ptr_N;//归位,准备下一次排序。
}//while(ptr)
cout<<"从高到低,排序成功!
"<returnHead;
}
//----------主函数----------------------
intmain()
{
fstreamofile;
ofile.open("e:
\\student.txt",ios_base:
:
out);
if(!
ofile)
{
cout<<"文件打开失败。
"<exit(-1);
}
Linkhead=0;
head=Create(head);
while
(1)
{
cout<<"*****************************************************"<cout<<"***1.添加信息2.修改信息3.删除信息4.信息查询***"<cout<<"***5.成绩统计6.排序7.显示/保存0.退出***"<cout<<"*****************************************************"<cout<<"请选择正确的菜单项:
";
intsel;
cin>>sel;
while(cin.fail())
{
cout<<"请选择正确的菜单项:
";
cin.clear();
fflush(stdin);
cin>>sel;
}
switch(sel)
{
case0:
exit(0);
case1:
head=AddInfo(head);
break;
case2:
head=Modify(head);
break;
case3:
head=DelInfo(head);
break;
case4:
Search(head);
break;
case5:
Grade_Stat(head);
break;
case6:
Sort(head);
break;
case7:
Display(head);//在标准显示器上显示。
Display(head,ofile);//在文件中显示。
break;
default:
break;
}
}
Release(head);
return0;
}