中南大学数据结构实验报告

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

中南大学数据结构实验报告实验题目:(1)单链表的实现(2)栈和队列(3)二叉树的遍历(4)查找与排序学生姓名:代巍学生学号:0909121615指导老师:余腊生所在学院:信息科学与工程学院专业班级:信息安全1201班指导教师评定:签名:实验一单链表的实现一、实验目的了解线性表的逻辑结构和各种存储表示方法,以及定义在逻辑结构上的各种基本运算及其在某种存储结构上如何实现这些基本运算。在熟悉上述内容的基础上,能够针对具体应用问题的要求和性质,选择合适的存储结构设计出相应的有效算法,解决与线性表相关的实际问题二、实验内容用C/C++语言编写程序,完成以下功能:(1)运行时输入数据,创建一个单链表(2)可在单链表的任意位置插入新结点(3)可删除单链表的任意一个结点(4)在单链表中查找结点(5)输出单链表三、程序设计的基本思想,原理和算法描述:(包括程序的结构,数据结构,输入/输出设计,符号名说明等)用一组地址任意的存储单元存放线性表中的数据元素。以元素(数据元素的映象)+指针(指示后继元素存储位置)=结点(表示数据元素或数据元素的映象)以“结点的序列”表示线性表称作线性链表(单链表)单链表是指数据接点是单向排列的。一个单链表结点,其结构类型分为两部分:(1)、数据域:用来存储本身数据。(2)、链域或称为指针域:用来存储下一个结点地址或者说指向其直接后继的指针。1、单链表的查找对单链表进行查找的思路为:对单链表的结点依次扫描,检测其数据域是否是我们所要查好的值,若是返回该结点的指针,否则返回NULL。2、单链表的插入因为在单链表的链域中包含了后继结点的存储地址,所以当我们实现的时候,只要知道该单链表的头指针,即可依次对每个结点的数据域进行检测。假设在一个单链表中存在2个连续结点p、q(其中p为q的直接前驱),若我们需要在p、q之间插入一个新结点s,那么我们必须先为s分配空间并赋值,然后使p的链域存储s的地址,s的链域存储q的地址即可。(p->link=s;s->link=q),这样就完成了插入操作。3、单链表的删除删除运算思想方法删除运算是将表的第i个结点删去。具体步骤:找到i-1的存储位置p令p-next指向i的直接后继结点释放结点i的空间,将其归还给存储池。四、源程序及注释#includeiostream.h#includestdlib.h#includemalloc.h#includeconio.h#includetime.h#defineElemTypeint//链表类型typedefstructLNode{ElemTypedata;structLNode*next;}LNode,*LinkList;intEmptyList(LinkList&L){if(L-next==NULL){return0;}else{return1;}}//手动建立一个带头结点的线性链表LvoidSCreateList_L(LinkList&L){LinkListl,p;inti;ElemTyped;l=(LinkList)malloc(sizeof(LNode));L=(LinkList)malloc(sizeof(LNode));//生成头结点l=L;L-next=NULL;cout请依次输入结点值,以0为结束:endl;for(i=1;i=1;){cind;if(d!=0){p=(LinkList)malloc(sizeof(LNode));//生成新结点p-data=d;p-next=l-next;l-next=p;l=l-next;}elsebreak;}if(EmptyList(L))cout生成链表成功!!;elsecout链表为空,未生成!!;cin.get();cin.get();}//SCreate_L//自动建立一个带头结点的线性链表LvoidZCreateList_L(LinkList&L,intn){LinkListl,p;l=(LinkList)malloc(sizeof(LNode));L=(LinkList)malloc(sizeof(LNode));//生成头结点l=L;L-next=NULL;srand((unsigned)time(NULL));for(inti=n;i0;--i){p=(LinkList)malloc(sizeof(LNode));//生成新结点p-data=(rand()%100+1);p-next=l-next;l-next=p;l=l-next;}cout生成链表成功!!;cin.get();cin.get();}//ZCreate_L//建立一个带头结点的线性链表LinkListCreateList_L(){charc;intn;LinkListL;cout*********建立线性链表*********endl;cout1.手动建立endl;cout2.自动建立endl;cout******************************endl;cinc;if(c=='1'){SCreateList_L(L);}elseif(c=='2'){cout请输入链表结点的个数:;cinn;ZCreateList_L(L,n);}else{cout输入错误,请重新输入:endl;}returnL;cin.get();cin.get();}//计算线性链表L中结点的个数intLengthList(LinkList&L){LinkListp=L-next;inti=0;while(p){++i;p=p-next;}returni;cin.get();cin.get();}//LengthList//在线性链表L中第i个结点之前插入新的数据元素evoidListInsert_L(LinkList&L){inti;ElemTypee;cout第i个结点之前插入新的结点,请输入i:;cini;while(i=0||iLengthList(L)){cout位置错误,重新输入插入位置:;cini;}LinkListp,s;p=L;intj=0;while(p&&ji-1){p=p-next;++j;}if(!p||ji-1){cout输入错误!!;cin.get();cin.get();}else{cout新结点的数据为:;cine;s=(LinkList)malloc(sizeof(LNode));s-data=e;s-next=p-next;p-next=s;cout插入成功!!;}cin.get();cin.get();}//ListInsert_L//删除线性链表L中的第i个结点voidListDelete_L(LinkList&L){inti;ElemTypee;cout请输入要删除第i个结点的i值:;cini;while(i=0||iLengthList(L)){cout位置错误,重新输入删除位置:;cini;}LinkListp,q;p=L;intj=0;q=(LinkList)malloc(sizeof(LNode));while(p-next&&ji-1){p=p-next;++j;}//寻找第i个结点if(!(p-next)||ji-1){cout删除位置不合理;cin.get();cin.get();}else{q=p-next;p-next=q-next;e=q-data;cout删除成功!!endl删除的结点值为:e;free(q);//删除并释放结点}cin.get();cin.get();}//ListDelete_L//输出线性链表L中的所有数据元素voidPrintList(LinkList&L){LinkListp=L-next;cout所有数据如下所示:endl;while(p){coutp-data;p=p-next;}cin.get();cin.get();}//PrintListvoidSearchList(LinkList&L)//查找某一结点,显示其位置{inti=0;ElemTypen;cout请输入要找的数据:;cinn;if(L==NULL){cout链表为空!!;}LinkListp=L-next;while(p-data!=n&&p-next!=NULL){p=p-next;i=i+1;}if(p-data==n){cout找到了对应的结点,在链表的第i+1位上!;}elsecout链表上找不到相应的的结点!!;cin.get();cin.get();}voidDestroyList(LinkList&L)//退出系统前,内部做结尾工作{while(L){LinkListp;p=L;L=L-next;free(p);}L=NULL;cout线性链表L已销毁!!endl;}//DestroyListintmenu_select()//选择函数{char*m[7]={1.建立线性链表,2.某一结点前插入一个结点,3.删除一个结点,4.计算结点个数并输出,5.查找并显示某一结点位置,6.输出所有节点,0.退出系统};inti;charc1;do{system(cls);/*清屏*/cout\n\n=========链表的基本操作=========\n\n;for(i=0;i7;i++)coutm[i]endl;cout\n==================================\n;cout请选择(1-6,0):;cinc1;}while(c1'0'||c1'6');return(c1-'0');}voidmain(){LinkListL=NULL;for(;;){switch(menu_select()){case1:L=CreateList_L();system(pause);break;case2:if(L!=NULL)ListInsert_L(L);else{cout链表为空,请先建链表!!;cin.get();cin.get();break;}system(pause);break;case3:if(L!=NULL)ListDelete_L(L);else{cout链表为空,请先建链表!!;cin.get();cin.get();break;}system(pause);break;case4:if(L!=NULL){inti=LengthList(L);cout结点的个数为:i;cin.get();cin.get();}else{cout链表为空,请先建链表!!;cin.get();cin.get();break;}system(pause);break;case5:if(L!=NULL)SearchList(L);else{cout链表为空,请先建链表!!;cin.get();cin.get();break;}system(pause);break;case6:if(L!=NULL)PrintList(L);else{cout链表为空,请先建链表!!;cin.get();cin.get();break;}system(pause);break;case0:if(L!=NULL)DestroyList(L);exit(0);}}}五、实验结果实验二栈和队列一、实验目的了解栈和队列的特性。掌握栈的顺序表示和实现。掌握栈的链式表示和实现。掌握队列的顺序表示和实现。掌握队列的链式表示和实现。掌握栈和队列在实际问题中的应用。二、实验内容编写一个程序实现顺序栈的各种基本运算,并在此基础上设计一个主程序完成如下功能:初始化顺序栈,插入元素,删除栈顶元素,取栈顶元素,遍历顺

1 / 38
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功