C++实验报告链表应用.docx

上传人:b****4 文档编号:3907818 上传时间:2022-11-26 格式:DOCX 页数:14 大小:18.05KB
下载 相关 举报
C++实验报告链表应用.docx_第1页
第1页 / 共14页
C++实验报告链表应用.docx_第2页
第2页 / 共14页
C++实验报告链表应用.docx_第3页
第3页 / 共14页
C++实验报告链表应用.docx_第4页
第4页 / 共14页
C++实验报告链表应用.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

C++实验报告链表应用.docx

《C++实验报告链表应用.docx》由会员分享,可在线阅读,更多相关《C++实验报告链表应用.docx(14页珍藏版)》请在冰豆网上搜索。

C++实验报告链表应用.docx

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");

}

}

}

链表应用——学生信息管理系统

四、实验总结:

本次试验所学的链表进行实际的应用,加深了我对链表的理解。

实验过程中也遇到了这样那样的错误,指针的指向错误,对链表的插入错误等等,实验的过程就是发现错误、改正错误并从中学习到新知识的过程。

这次实验我学到的不仅仅是课本上的知识,更重要的是做好一次实验的方法和所必需的耐心和细心。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 其它课程

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1