C++实验报告链表应用.docx
- 文档编号:3907818
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:14
- 大小:18.05KB
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< cout.width(16); //如果姓名不为空,输出姓名,否则输出空字符串 cout<<(p->name? p->name: ""); cout.width(4); //输出身高,并换行 cout< //转到下一个节点 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"); } } } 链表应用——学生信息管理系统 四、实验总结: 本次试验所学的链表进行实际的应用,加深了我对链表的理解。 实验过程中也遇到了这样那样的错误,指针的指向错误,对链表的插入错误等等,实验的过程就是发现错误、改正错误并从中学习到新知识的过程。 这次实验我学到的不仅仅是课本上的知识,更重要的是做好一次实验的方法和所必需的耐心和细心。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 实验 报告 应用