数据结构线性表的链式表示和实现的实习报告.docx
- 文档编号:24241188
- 上传时间:2023-05-25
- 格式:DOCX
- 页数:24
- 大小:531.44KB
数据结构线性表的链式表示和实现的实习报告.docx
《数据结构线性表的链式表示和实现的实习报告.docx》由会员分享,可在线阅读,更多相关《数据结构线性表的链式表示和实现的实习报告.docx(24页珍藏版)》请在冰豆网上搜索。
数据结构线性表的链式表示和实现的实习报告
长沙理工大学
数学与计算科学学院
实验报告
实验项目名称线性表的链式表示与实现
所属课程名称数据结构
实验类型验证型
实验日期
班级
学号
姓名
成绩
一、实验概述:
【实验目的】
1.掌握单链表的基本操作在链式存储结构上的实现。
2.学会定义链式表的存储结构,学会用C++语言来实现链式表的基本操作,提高编程能力
3.线性表的逻辑结构特征
3.1以元素在计算机内“物理位置相邻”来表示线性表中数据元素之间的逻辑关系。
3.2有且仅有一个开始结点,没有直接前驱,且仅有一个直接后继;有且仅有一个终结结点,没有直接后继,且仅有一个直接前驱。
3.3其余内部结点都有且仅有一个直接前驱和一个直接后继。
【实验原理】
1.线性链表的特点
1.1动态分配的存储结构
1.2每一个结点的指针域指向其直接后继元素的数据域,尾元结点除外
1.3指针是数据元素之间的逻辑关系的映像
2线性链表的类C语言表示
typedefstructLNode
{
ElemTypedata;
structLNode*next;
}LNode,*LinkList;
【实验环境】
VC++6.0
二、【实验内容】
【实验方案】
编写主函数,调用链式表的存储结构初始化建表,插入和删除的算法,调试运行得出结果
【实验过程】(实验步骤、记录、数据、分析)
1.先将线性表的单链表存储结构与算法编入VC++6.0中
TypedefstructLNode
{
ElemTypedata;
structLNode*next;
}LNode,*LinkList;
voidCreateList_L(LinkList&L,intn)
{
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
for(i=n;i>0;--i)
{
p=(LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next=L->next;
L->next=p;
}
}
StatusGetElem_L(LinkListL,inti,ElemType&e)
{
p=L->next;
j=1;
while(p&&j
{
p=p->next;
++j;
}
if(!
p||j>i)
returnERROR;
e=p->data;
returnOK;
}
StatusListInsert_L(LinkList&L,inti,ElemTypee)
{
p=L;
j=0;
while(p&&j { p=p->next; ++j; } if(! p||j>i-1) returnERROR; s=(LinkList)malloc(sizeof(LNode)); s->data=e; s->next=p->next; p->next=s; returnOK; } StatusListDelete_L(LinkList&L,inti,ElemType&e) { p=L; j=0; while(p->next&&j { p=p->next; ++j; } if(! p->next||j>i-1) returnERROR; q=p->next; p->next=q->next; e=q->data; free(q); returnOK; } 2.调试第一次显示错误如下: 原因: 由于没有头文件及宏定义以及自定义,因此导致许多错误,可能还有许多错误没有显示 3.将以下语句编入VC++6.0中 #include"stdio.h" #include"stdlib.h" #defineOK1 #defineERROR0 typedefintElemType; typedefintStatus; 4.调试第二次显示错误如下: 原因: 由于算法中许多变量没有定义,因此有许多错误 5.将以下语句加入算法中: inti; LinkListp;(加入创建链表的算法中) LinkListp; intj;(加入查找元素的算法中) LinkListp,s; intj;(加入插入元素的算法中) LinkListp,q; intj;(加入删除元素的算法中) 6.调试第三次显示没有错误: 7.现在开始编写主函数: (1)先编写调用创建链表的函数的主函数: 如下: voidmain() { LinkListL; inti,n; scanf("%d",&n); CreateList_L(L,n); for(i=n;i>0;--i) printf("%d",L->data); printf("\n"); } 调试显示为: 运行显示为: 产生了随机数说明for循环语句那里编写错误 因此修改为: LinkListp; for(p=L->next;p! =NULL;p=p->next) printf("%d",p->data); 调试显示为: 运行显示为: 这次正确了那么继续编写下面的其他主函数,形成的总的主函数为: voidmain() { LinkListL,p; inti,n; scanf("%d",&n); CreateList_L(L,n); for(p=L->next;p! =NULL;p=p->next) printf("%d",p->data); printf("\n"); ElemTypee; scanf("%d",&i); GetElem_L(L,i,e); printf("%d\n",e); scanf("%d",&i); scanf("%d",&e); ListInsert_L(L,i,e); for(p=L->next;p! =NULL;p=p->next) printf("%d",p->data); printf("\n"); scanf("%d",&i); ListDelete_L(L,i,e); printf("%d\n",e); for(p=L->next;p! =NULL;p=p->next) printf("%d",p->data); printf("\n"); } 8.调试第四次显示为: 9.运行显示结果为: 10.但运行后的界面显得很单调;要是忘记下一个算法是什么就容易输入出错,也不适合大众使用;因此为了将程序优化,所以在主函数中增加以下输入输出语句 和条件语句;为了让程序更加严谨,因此还加入一些循环语句以及条件语句,那么主函数语句变为: main() { LinkListL,p; inti,n,x,y,z; ElemTypee; printf("请输入您想构建的链式表的元素个数: \n"); scanf("%d",&n); printf("请输入您想构建的链式表: \n"); CreateList_L(L,n); printf("您构建的链式表是: \n"); for(p=L->next;p! =NULL;p=p->next) printf("%d",p->data); printf("\n"); printf("请输入您想查找的元素是第几个元素: \n"); scanf("%d",&i); for(x=2;(i<=0||i>n)&&x>=0;--x) { switch(x) { case2: printf("输入的数字错误,还有两次重新输入符合要求的数字的机会: \n");break; case1: printf("输入的数字错误,还有一次重新输入符合要求的数字的机会: \n");break; case0: printf("输入的数字错误,您的输入机会已经用完\n");returnERROR; } scanf("%d",&i); } GetElem_L(L,i,e); printf("您查找的元素是: \n"); printf("%d\n",e); printf("请输入您想在第几个元素位置前插入元素: \n"); scanf("%d",&i); for(y=2;(i<=0||i>n)&&y>=0;--y) { switch(y) { case2: printf("输入的数字错误,还有两次重新输入符合要求的数字的机会: \n");break; case1: printf("输入的数字错误,还有一次重新输入符合要求的数字的机会: \n");break; case0: printf("输入的数字错误,您的输入机会已经用完\n");returnERROR; } scanf("%d",&i); } printf("请输入您想插入的元素: \n"); scanf("%d",&e); ListInsert_L(L,i,e); printf("形成的新链式表为: \n"); for(p=L->next;p! =NULL;p=p->next) printf("%d",p->data); printf("\n"); printf("请输入您想删除的元素是第几个元素: \n"); scanf("%d",&i); for(z=2;(i<=0||i>n+1)&&z>=0;--z) { switch(z) { case2: printf("输入的数字错误,还有两次重新输入符合要求的数字的机会: \n");break; case1: printf("输入的数字错误,还有一次重新输入符合要求的数字的机会: \n");break; case0: printf("输入的数字错误,您的输入机会已经用完\n");returnERROR; } scanf("%d",&i); } ListDelete_L(L,i,e); printf("您想删除的元素是: \n"); printf("%d\n",e); printf("形成的新链式表示: \n"); for(p=L->next;p! =NULL;p=p->next) printf("%d",p->data); printf("\n"); return0; } 11.调试第五次显示为: 、 12.运行后结果显示为: 这样那么程序就完整了,清晰明了,用户运行的时候也易知道自己要输入什么了 【实验结论】(结果) 【实验小结】(收获体会) 1.实验程序应该多些注释,这样方便人家读懂自己编写的程序。 2.主函数中多增加一些printf函数,方便运行时输入数据 3.编写程序是细心一点,注意大小写,注意单词拼写,还要注意分号 4.努力看书,要看懂算法的功能,结合C语言知识能快速调试并且改正错误 5.要清楚算法不同于程序,算法就相当于C语言中的定义函数功能语句且是不完整的语句。 三、指导教师评语及成绩: 评语 评语等级 优 良 中 及格 不及格 1.实验报告按时完成,字迹清楚,文字叙述流畅,逻辑性强 2.实验方案设计合理 3.实验过程(实验步骤详细,记录完整,数据合理,分析透彻) 4实验结论正确. 成绩: 指导教师签名: 批阅日期: 附录1: 源程序 #include"stdio.h" #include"stdlib.h" #defineOK1 #defineERROR0 typedefintElemType; typedefintStatus; typedefstructLNode { ElemTypedata; structLNode*next; }LNode,*LinkList; voidCreateList_L(LinkList&L,intn)//逆位序输入n个元素的值,建立带表头结点的单链线性表L { inti; LinkListp; L=(LinkList)malloc(sizeof(LNode)); L->next=NULL;//先建立一个带头结点的单链表 for(i=n;i>0;--i) { p=(LinkList)malloc(sizeof(LNode));//生成新结点 scanf("%d",&p->data);//逆位序输入n个元素的值 p->next=L->next; L->next=p;//插入到表头 } }//CreateList_L StatusGetElem_L(LinkList&L,inti,ElemType&e)//当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR { LinkListp; int=j; p=L->next; j=1;//初始化,p指向第一个结点,j为计数器 while(p&&j { p=p->next; ++j;//顺指针向后查找,直到p指向第i个元素或p为空 } if(! p||j>i) returnERROR;//第i个元素不存在 e=p->data;//取第i个元素 returnOK; }//GetElem_L statusListInsert_L(LinkList&L,inti,ElemTypee)//在带头结点的单链线性表L的第i个元素之前插入元素e { intj; LinkListp,s; p=L; j=0; while(p&&j { p=p->next; ++j; } if(! p||j>i-1)//i小于1或者大于表长 returnERROR; s=(LinkList)malloc(sizeof(LNode));//生成新结点 s->data=e; s->next=p->next;//插入L中 p->next=s; returnOK; }//LinstInsert_L StatusListDelete_L(LinkList&L,inti,ElemType&e)//在带头结点的单链线性表L中,删除第i个元素,并由e返回其值 { intj; LinkListp,q; p=L; j=0; while(p->next&&j { p=p->next; ++j; } if(! p->next||j>i-1) returnERROR;//删除位置不合理 q=p->next; p->next=q->next; e=q->data; free(q);//删除并释放结点 returnOK; }//ListDelete_L main() { LinkListL,p; inti,n,x,y,z; ElemTypee; printf("请输入您想构建的链式表的元素个数: \n"); scanf("%d",&n); printf("请输入您想构建的链式表: \n"); CreateList_L(L,n); printf("您构建的链式表是: \n"); for(p=L->next;p! =NULL;p=p->next) printf("%d",p->data); printf("\n"); printf("请输入您想查找的元素是第几个元素: \n"); scanf("%d",&i); for(x=2;(i<=0||i>n)&&x>=0;--x) { switch(x) { case2: printf("输入的数字错误,还有两次重新输入符合要求的数字的机会: \n");break; case1: printf("输入的数字错误,还有一次重新输入符合要求的数字的机会: \n");break; case0: printf("输入的数字错误,您的输入机会已经用完\n");returnERROR; } scanf("%d",&i); } GetElem_L(L,i,e); printf("您查找的元素是: \n"); printf("%d\n",e); printf("请输入您想在第几个元素位置前插入元素: \n"); scanf("%d",&i); for(y=2;(i<=0||i>n)&&y>=0;--y) { switch(y) { case2: printf("输入的数字错误,还有两次重新输入符合要求的数字的机会: \n");break; case1: printf("输入的数字错误,还有一次重新输入符合要求的数字的机会: \n");break; case0: printf("输入的数字错误,您的输入机会已经用完\n");returnERROR; } scanf("%d",&i); } printf("请输入您想插入的元素: \n"); scanf("%d",&e); ListInsert_L(L,i,e); printf("形成的新链式表为: \n"); for(p=L->next;p! =NULL;p=p->next) printf("%d",p->data); printf("\n"); printf("请输入您想删除的元素是第几个元素: \n"); scanf("%d",&i); for(z=2;(i<=0||i>n+1)&&z>=0;--z) { switch(z) { case2: printf("输入的数字错误,还有两次重新输入符合要求的数字的机会: \n");break; case1: printf("输入的数字错误,还有一次重新输入符合要求的数字的机会: \n");break; case0: printf("输入的数字错误,您的输入机会已经用完\n");returnERROR; } scanf("%d",&i); } ListDelete_L(L,i,e); printf("您想删除的元素是: \n"); printf("%d\n",e); printf("形成的新链式表示: \n"); for(p=L->next;p! =NULL;p=p->next) printf("%d",p->data); printf("\n"); return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 线性 链式 表示 实现 实习 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)