C++实验报告链表应用.docx
《C++实验报告链表应用.docx》由会员分享,可在线阅读,更多相关《C++实验报告链表应用.docx(14页珍藏版)》请在冰豆网上搜索。
C++实验报告链表应用
C++实验报告:
链表应用
链表应用——学生信息管理系统
班级:
*******学号:
************姓名:
*****
链表应用——学生信息管理系统
一、实验内容
定义一个链表,其中的数组元素为结构体成员,结构体中的学生信息有学号、姓名、身高,还有用于存放下一结点的结构体指针。
然后定义在其上操作的函数,有在首部插入结点、在尾部插入结点、在某一个结点前插入结点、删除指定的结点、删除全部结点、修改指定结点的数据部分、显示全部结点信息、按照结构体结点中某一个数据项对链表进行排序。
从主函数开始执行,输入数据,选择执行操作的类型,进入到各个函数中执行相应的操作,执行完毕后,返回主函数,结束程序的运行。
二、功能模块简介
主函数:
程序开始运行后,由主函数定义头结点StuLstlst,将结点的next域置为NULL。
然后,显示指示用户进行输入的信息,供用户进行阅读了解,然后进行输入操作。
对各个模块进行简介:
0.结束程序:
在主界面输入0,退出正在运行的程序。
1.显示所有节点信息:
在主界面输入1,调用函数ShowLst(StuLst*lst)进行显示结点信息操作。
如果链表不为空,则显示所有结点的信息。
先设置输出信息格式,输出表头信息,定义指针*p=lst->next;用while循环,每次使p=p->next;如果p不为空则输出显示该节点的数据信息,然后依次显示每个节点的数据信息。
2.插入节点到头部:
在主界面输入2,调用函数InsertToFirst(StuLst*lst)插入结点到链表的头部。
定义结构体指针并为它分配一个地址空间Stu*pSt=newStu;用来接收用户输入的信息,屏幕上显示出提示信息,请用户输入信息,如果输入的学号信息不为"0",则在执行完这一次输入后,继续执行下一次输入。
输入完毕后,将该结构体指针插入到链表的头部
去:
pSt->next=lst->next;lst->next=pSt。
3.插入节点到尾部:
在主界面输入3,调用函数InsertToLast(StuLst*lst)插入结点到链表的尾部。
定义结构体指针并为它分配一个地址空间Stu*pSt=newStu;用来接收用户输入的信息,屏幕上显示出提示信息,请用户输入信息。
输入完毕后,调用函数GetTail(lst)返回链表的尾部指针,将该结构体指针插入到链表的尾部去:
GetTail(lst)->next=pSt;pSt->next=NULL。
4.插入节点到某个节点之前:
在主界面输入4,调用函数InsertBefore(StuLst*lst)插入结点到某个指定结点之前。
定义整型变量用于接收用户输入的要插入的位置intnMark;定义结构体指针并为它分配一个地址空间Stu*pSt=newStu;用来接收用户输入的信息,屏幕上显示出提示信息,请用户输入信息。
输入完毕后,定义结构体指针指向头结点:
Stu*p=lst;用while循环遍历整个链表,每次使p=p->next;如果p->next不为空,继续下一次循环。
如果找到第nMark个结点,将该
链表应用——学生信息管理系统
结构体变量插入到该结点前面去pSt->next=p->next;p->next=pSt;退出循环。
5.修改某个节点的数据部分:
在主界面输入5,调用函数Modify(StuLst*lst)修改某个指定的结点的数据部分。
定义学号字符数组用于接收用于输入的要修改的结点的学号信息:
charid[ID_LEN];定义姓名字符数组,用于接收用户输入的新的姓名:
charname[NAME_LEN];定义整型变量,用于接收用户输入的新的身高:
intnHeight;在用户输入信息完毕后,定义结构体指针指向头结点的下一个结点:
Stu*p=lst->next;用while循环遍历整个链表,如果p不为空,每次使p=p->next;如果找到学号与输入的学号相同的结点,用输入的新的数据替换该结点原有的信息,如果输入的姓名不为空,则将执行替换,否则不执行,替换完成后,退出循环。
6.删除某个节点:
在主界面输入6,调用函数DeleteById(StuLst*lst)删除指定结点。
定义学号字符数组,
在用户输入信息完毕后,用于接收用户输入的要删除的结点的学号信息:
charid[ID_LEN]。
定义结构体指针指向头结点:
Stu*p=lst;使用while循环遍历整个链表,如果p->next不为空,使p=p->next;如果找出学号信息与所输入的学号信息相符的结点,将其删除,并释放它所占用的存储空间:
Stu*q=p->next;p->next=q->next;deleteq;执行删除完毕后,推出循环。
7.删除全部节点:
在主界面输入7,调用函数DeleteAll(StuLst*lst)删除全部结点。
定义结构体指针指向头结点:
Stu*p=lst;使用while循环遍历整个链表,如果p->next不为空,使p=p->next;删除每一个结点Stu*q=p->next;p->next=q->next;deleteq;清空链表完成后,退出循环。
8.对节点进行排序:
在主界面输入8,调用函数ShowByHeight(StuLst*lst)对链表按结点中的身高信息进行排序。
定义一个整型变量用来保存链表的长度:
intnLength=Length(lst);定义结构体指针指向头结点:
Stu*p=lst;定义两个字符数组用来交换两个结点中的学号和姓名数据:
chartemp1[ID_LEN],temp2[NAME_LEN];定义一个整型变量用来交换两个结点中的身高数据:
inttemp3;使用两个for循环遍历整个链表,依次比较每个结点的身高大小,如果某一个结点的身高大于该结点的下一个结点的身高,则将两个结点的信息进行交换。
排序完成后,调用函数ShowLst(lst)对排序后的链表进行输出显示。
三、程序代码
#include
#include
#include
//定义学号字符数组的长度
#defineID_LEN10
//定义姓名字符数组的长度
#defineNAME_LEN20
structStu//定义结点结构体
{
//存放学生的学号信息
charid[ID_LEN];
链表应用——学生信息管理系统
//存放学生的姓名信息
charname[NAME_LEN];
//存放学生的身高信息
intnHeight;
//存放下一结点的地址
Stu*next;
};
typedefStuStuLst;
//删除某个节点
voidDeleteById(StuLst*lst)
{
//如果链表为空,返回调用函数
if(!
lst)
return;
//定义学号字符数组,用于接收用户输入的要删除的结点的学号信息
charid[ID_LEN];
while
(1)
{
cout<<"请输入要删除的节点的学号:
"<cin>>id;
if(id==NULL)
cout<<"学号不能为空!
"<else
break;
}
Stu*p=lst;
while(p->next)
{
if(strcmp(p->next->id,id)==0)
{
Stu*q=p->next;
p->next=q->next;
deleteq;
break;
}
p=p->next;
}
}
链表应用——学生信息管理系统//删除全部节点
voidDeleteAll(StuLst*lst){
//如果链表为空,则返回调用函数
if(!
lst)
return;
Stu*p=lst;
//p的下一结点不为空则执行循环
while(p->next)
{
Stu*q=p->next;
p->next=q->next;
deleteq;
}
}
//修改某个节点的数据部分
voidModify(StuLst*lst){
if(!
lst)
return;
//定义学号字符数组,用于接收用于输入的要修改的结点的学号信息
charid[ID_LEN];
//定义姓名字符数组,用于接收用户输入的要修改的结点的新姓名
charname[NAME_LEN];
//定义整型变量,用于接收用户输入的要修改的结点的新身高
intnHeight;
//输入信息
while
(1)
{
cout<<"请输入要修改的节点的学号:
"<cin>>id;
cout<<"请输入新的姓名:
"<cin>>name;
cout<<"请输入新的身高:
"<cin>>nHeight;
if(!
id)
cout<<"学号不能为空!
"<else
break;
}
链表应用——学生信息管理系统
Stu*p=lst->next;
while(p)
{
if(strcmp(p->id,id)==0)
{
p->nHeight=nHeight;
if(name)
strcpy(p->name,name);
}
p=p->next;
}
}
//将指针指向尾节点
Stu*GetTail(StuLst*lst)
{
if(!
lst)
returnNULL;
Stu*p=lst;
while(p->next)
p=p->next;
returnp;
}
//计算链表的长度
intLength(StuLst*lst){
if(!
lst)
return0;
intnLength=0;
Stu*p=lst;
while(p->next)
{
nLength++;
p=p->next;
}
returnnLength;}
链表应用——学生信息管理系统
//输入所有节点信息
voidShowLst(StuLst*lst){
//验证链表是否为空链表
if(!
lst)
return;
Stu*p=lst->next;
//设置输出行:
左对齐
cout.setf(ios:
:
left);
//设置输出字符串占用的宽度:
10
cout.width(10);
";cout<<"学号
cout.width(16);
cout<<"姓名";
cout.width(4);
cout<<"身高"<cout<<"---------------------"<//判断p节点是否为空
while(p)
{
cout.width(10);
//输入学号
cout<id;
cout.width(16);
//如果姓名不为空,输出姓名,否则输出空字符串
cout<<(p->name?
p->name:
"");
cout.width(4);
//输出身高,并换行
cout<nHeight<//转到下一个节点
p=p->next;
}
}
//插入节点到头部
voidInsertToFirst(StuLst*lst)
{
//验证数据是否合法
if(lst==NULL)
return;
//构造新节点
Stu*pSt=newStu;
链表应用——学生信息管理系统
//给新节点赋值
while
(1){
system("cls");
cout<<"请输入学号:
"<//输入节点信息
cin>>(pSt->id);
if(strcmp(pSt->id,"0")==0)
break;
cout<<"姓名:
"<cin>>(pSt->name);
cout<<"身高:
"<cin>>(pSt->nHeight);
//插入到链表第一个位置
=lst->next;pSt->next
lst->next=pSt;
}
}
//插入节点到尾部
voidInsertToLast(StuLst*lst)
{
//验证数据是否合法
if(lst==NULL)
return;
//构造新节点
Stu*pSt=newStu;
//给新节点赋值
while
(1){
cout<<"请输入学号:
"<//输入节点信息
cin>>(pSt->id);
cout<<"姓名:
"<cin>>(pSt->name);
cout<<"身高:
"<cin>>(pSt->nHeight);
if(pSt->id)
break;
else
cout<<"学号不能为空!
"<}
链表应用——学生信息管理系统
//插入到尾部
GetTail(lst)->next=pSt;
pSt->next=NULL;
}
//在某个节点之前插入节点
voidInsertBefore(StuLst*lst)
{
//验证数据是否合法
if(lst==NULL)
return;
//构造新节点
Stu*pSt=newStu;
//定义要插入位置的标记
intnMark;
//给新节点赋值
while
(1){
cout<<"请输入学号:
"<//输入节点信息
cin>>(pSt->id);
cout<<"姓名:
"<cin>>(pSt->name);
cout<<"身高:
"<cin>>(pSt->nHeight);
cout<<"输入要插入的位置(在第几个节点之前):
"<cin>>nMark;
if(pSt->id)
break;
else
cout<<"学号不能为空!
"<}
Stu*p=lst;
inti=0;
while(p->next)
{
i++;
if(i==nMark)
{
pSt->next=p->next;
p->next=pSt;
链表应用——学生信息管理系统
break;
}
p=p->next;
}
}
//按身高对链表进行排序
voidShowByHeight(StuLst*lst){
//如果链表为空,返回调用函数
if(!
lst)
return;
//求链表的长度
intnLength=Length(lst);
定义新的指针,指向头结点//
Stu*p=lst;
//定义存放临时信息的字符数组
chartemp1[ID_LEN],temp2[NAME_LEN];
inttemp3,i,j;
//遍历整个链表,依次比较每个结点的身高大小
for(i=0;i{
p=lst->next;
for(j=0;j{
//交换结点信息
if((p->nHeight)>(p->next->nHeight))
{
strcpy(temp1,p->id);
strcpy(p->id,p->next->id);
strcpy(p->next->id,temp1);
strcpy(temp2,p->name);
strcpy(p->name,p->next->name);
strcpy(p->next->name,temp2);
temp3=p->nHeight;
p->nHeight=p->next->nHeight;
p->next->nHeight=temp3;
}
p=p->next;
}
}
//对链表进行排序后,输出显示所有结点信息
ShowLst(lst);
链表应用——学生信息管理系统}
voidmain()
{
//定义头结点
StuLstlst;
//使头结点的next指针域为NULL
lst.next=NULL;
intm;
while
(1)
{
system("cls");
cout<<"1.显示所有节点信息;"<cout<<"2.插入节点到头部;"<cout<<"3.插入节点到尾部;"<cout<<"4.插入节点到某个节点之前;"<cout<<"5.修改某个节点的数据部分;"<cout<<"6.删除某个节点;"<cout<<"7.删除全部节点;"<cout<<"8.对节点进行排序;"<cout<<"0.结束程序."<cout<<"请输入数字:
"<cin>>m;
if(m<0||m>8)
cout<<"输入有误,请重新输入:
"<else
{
switch(m)
{
case1:
ShowLst(&lst);break;
case2:
InsertToFirst(&lst);break;
case3:
InsertToLast(&lst);break;
case4:
InsertBefore(&lst);break;
case5:
Modify(&lst);break;
case6:
DeleteById(&lst);break;
case7:
DeleteAll(&lst);break;
case8:
ShowByHeight(&lst);break;
case0:
return;
}
cout<<"操作结束,请重新选择:
"<system("pause");
}
}
}
链表应用——学生信息管理系统
四、实验总结:
本次试验所学的链表进行实际的应用,加深了我对链表的理解。
实验过程中也遇到了这样那样的错误,指针的指向错误,对链表的插入错误等等,实验的过程就是发现错误、改正错误并从中学习到新知识的过程。
这次实验我学到的不仅仅是课本上的知识,更重要的是做好一次实验的方法和所必需的耐心和细心。