1、中南大学数据结构实验报告中南大学数据结构实验报告实验题目:(1)单链表的实现(2)栈和队列 (3)二叉树的遍历(4)查找与排序 学生姓名: 代巍 学生学号: * * * 所在学院: 信息科学与工程学院 专业班级: 信息安全1201班 指导教师评定: 签 名: 实验一 单链表的实现一、实验目的了解线性表的逻辑结构和各种存储表示方法,以及定义在逻辑结构上的各种基本运算及其在某种存储结构上如何实现这些基本运算。在熟悉上述内容的基础上,能够针对具体应用问题的要求和性质,选择合适的存储结构设计出相应的有效算法,解决与线性表相关的实际问题二、实验内容用C/C+语言编写程序,完成以下功能:(1)运行时输入数
2、据,创建一个单链表(2)可在单链表的任意位置插入新结点(3)可删除单链表的任意一个结点(4)在单链表中查找结点(5)输出单链表三、程序设计的基本思想,原理和算法描述:(包括程序的结构,数据结构,输入/输出设计,符号名说明等)用一组地址任意的存储单元存放线性表中的数据元素。以元素(数据元素的映象)+指针(指示后继元素存储位置)=结点(表示数据元素或数据元素的映象)以“结点的序列”表示线性表称作线性链表(单链表)单链表是指数据接点是单向排列的。一个单链表结点,其结构类型分为两部分:(1)、数据域:用来存储本身数据。(2)、链域或称为指针域:用来存储下一个结点地址或者说指向其直接后继的指针。1、单链
3、表的查找对单链表进行查找的思路为:对单链表的结点依次扫描,检测其数据域是否是我们所要查好的值,若是返回该结点的指针,否则返回NULL。2、单链表的插入因为在单链表的链域中包含了后继结点的存储地址,所以当我们实现的时候,只要知道该单链表的头指针,即可依次对每个结点的数据域进行检测。假设在一个单链表中存在2个连续结点p、q(其中p为q的直接前驱),若我们需要在p、q之间插入一个新结点s,那么我们必须先为s分配空间并赋值,然后使p的链域存储s的地址,s的链域存储q的地址即可。(p-link=s;s-link=q),这样就完成了插入操作。3、单链表的删除删除运算思想方法删除运算是将表的第i个结点删去。
4、具体步骤:找到i-1的存储位置p令p-next指向i的直接后继结点释放结点i的空间,将其归还给存储池。四、源程序及注释#include #include #include #include #include #define ElemType int/ 链表类型typedef struct LNodeElemType data;struct LNode *next; LNode, *LinkList;int EmptyList(LinkList &L)if(L-next=NULL)return 0;elsereturn 1; / 手动建立一个带头结点的线性链表Lvoid SCreateList_
5、L(LinkList &L) LinkList l,p;int i;ElemType d;l=(LinkList) malloc(sizeof(LNode);L=(LinkList) malloc(sizeof(LNode); /生成头结点l=L; L-next=NULL;cout请依次输入结点值,以0为结束:d; if(d!=0)p=(LinkList) malloc(sizeof(LNode); /生成新结点p-data=d;p-next=l-next;l-next=p;l=l-next; else break;if(EmptyList(L) cout生成链表成功!;else coutne
6、xt=NULL;srand(unsigned)time(NULL);for(int i=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/建立一个带头结点的线性链表LinkList CreateList_L() char c;int n;LinkList L;cout*建立线性链表*endl;cout1.手动建立endl;cout2.自动建立endl
7、;cout*c;if(c=1) SCreateList_L(L);else if(c=2) coutn;ZCreateList_L(L,n);else cout输入错误,请重新输入:next;int i=0;while (p)+i;p=p-next;return i;cin.get();cin.get(); /LengthList/ 在线性链表L中第i个结点之前插入新的数据元素evoid ListInsert_L(LinkList &L)int i;ElemType e;couti;while(iLengthList(L)couti;LinkList p,s; p=L;int j=0;whil
8、e(p & jnext;+j;if(!p | ji-1) cout输入错误!;cin.get();cin.get();else coute;s=(LinkList) malloc(sizeof(LNode);s-data=e;s-next=p-next;p-next=s;cout插入成功!;cin.get();cin.get(); /ListInsert_L/ 删除线性链表L中的第i个结点void ListDelete_L(LinkList &L)int i;ElemType e;couti;while(iLengthList(L)couti;LinkList p,q; p=L; int j=
9、0;q=(LinkList) malloc(sizeof(LNode);while (p-next & jnext;+j; /寻找第i个结点if(!(p-next) | ji-1) coutnext;p-next=q-next;e=q-data;cout删除成功!endl删除的结点值为:next;cout所有数据如下所示:endl;while (p)coutdatanext;cin.get();cin.get(); /PrintListvoid SearchList(LinkList &L)/查找某一结点,显示其位置int i=0;ElemType n;coutn;if(L=NULL) cou
10、tnext;while (p-data!=n & p-next!=NULL) p=p-next; i=i+1;if(p-data=n) cout找到了对应的结点,在链表的第i+1位上!;else coutnext;free(p);L=NULL;cout线性链表L已销毁!endl;/DestroyListint menu_select() /选择函数char *m7= 1.建立线性链表,2.某一结点前插入一个结点,3.删除一个结点,4.计算结点个数并输出,5.查找并显示某一结点位置,6.输出所有节点,0.退出系统;int i;char c1;dosystem(cls);/*清屏*/coutnn=
11、链表的基本操作=nn;for(i=0;i7;i+)coutmiendl;coutn=n;coutc1;while(c16);return(c1-0);void main()LinkList L=NULL;for( ; ; ) switch(menu_select()case 1:L=CreateList_L();system(pause);break;case 2:if(L!=NULL) ListInsert_L(L); else cout链表为空,请先建链表!;cin.get();cin.get();break;system(pause);break;case 3:if(L!=NULL) L
12、istDelete_L(L); else cout链表为空,请先建链表!;cin.get();cin.get();break;system(pause);break;case 4:if(L!=NULL) int i=LengthList(L);cout结点的个数为:i;cin.get();cin.get(); else cout链表为空,请先建链表!;cin.get();cin.get();break;system(pause);break; case 5:if(L!=NULL) SearchList(L);else cout链表为空,请先建链表!;cin.get();cin.get();br
13、eak;system(pause);break;case 6:if(L!=NULL) PrintList(L); else cout链表为空,请先建链表!;cin.get();cin.get();break; system(pause);break;case 0:if(L!=NULL) DestroyList(L);exit(0);五、实验结果实验二 栈和队列一、实验目的了解栈和队列的特性。 掌握栈的顺序表示和实现。 掌握栈的链式表示和实现。 掌握队列的顺序表示和实现。 掌握队列的链式表示和实现。 掌握栈和队列在实际问题中的应用。二、实验内容编写一个程序实现顺序栈的各种基本运算,并在此基础上设
14、计一个主程序完成如下功能:初始化顺序栈,插入元素,删除栈顶元素,取栈顶元素,遍历顺序栈,置空顺序栈。三、程序设计的基本思想,原理和算法描述栈的修改时按照先进后出的原则进行的,试验中用到构造空栈,及入栈出栈操作。队列是一种先进先出的线性表,只允许在表的一端插入,而在另一端删除元素,试验中构造队并且入队出队。立顺序栈SeqStack,存放测试数据;建立队列SeqQueue存放出栈数据;建立InitStack、StackEmpty、StackFull、Pop、Push、GetTop函数用作顺序栈的基本操作;建立InitQueue、QEmpty、Qfull、InQueue、OutQueue、ReadF
15、ront函数用作队列的基本操作;建立主函数依次按序对子函数进行操作:InitStack初始化栈Push压入数据InitQueue初始化队列Pop弹出数据InQueue存入队列OutQueue出队列Push压入栈Pop弹出数据free清空栈与队列。在数据的输入与数据的输出时提供必要的提示信息。四、源程序及其注释#include #include stack.h#include #define MAXSIZE 100/作用 :对栈进行初始化/参数:无/返回值:SeqStackSeqStack SeqStackInit() SeqStack S ; S.top = -1 ; return S ;/作
16、用 :对栈进行判断是否为空/参数:传入要判断的栈/返回值:返回TRUE为空,返回FLASE为非空int SeqStackEmpty(SeqStack S) if(S.top top - ; printf(n清空!n) ;/作用 :把元素x压入栈,使其成为新的栈顶元素/参数:传入栈和要输入的数字/返回值:无void SeqStackPush(SeqStack *S,DataType x) S-top+ ;/要求是先挖坑,再种萝卜 S-dataS-top = x ; /作用 :出栈/参数:要从该栈出来/返回值:从栈中出来的数DataType SeqStackPop(SeqStack *S) Dat
17、aType temp ; if(SeqStackEmpty(*S) printf(sorry!为空栈!) ; / exit(1) ; else temp = S-dataS-top ;/出栈是当前出栈,要求先挖萝卜再填坑 S-top - ; printf(n%dn,temp) ; /作用 :取栈顶元素/参数:要操作的栈/返回值:从栈中出来的数DataType SeqStackGetTop(SeqStack S) DataType temp ; if(SeqStackEmpty(S) printf(sorry!为空栈!) ; / exit(1) ; else temp = S.dataS.top
18、 ;/出栈是当前出栈,要求先挖萝卜再填坑 printf(n%dn,temp) ; /作用 输出顺序栈中的元素/参数:要操作的栈/返回值:从栈中出来的数void SeqStackPrint(SeqStack S) DataType temp ; SeqStack p ; p = S ; printf(输出栈中的所有元素:) ; while(!SeqStackEmpty(p) temp = p.datap.top ;/出栈是当前出栈,要求先挖萝卜再填坑 p.top - ; printf(n% d n,temp) ;/当这里位置数据类型怎么办 void main(void) int num ; in
19、t input ; SeqStack p ; p = SeqStackInit() ; /这里调用入栈函数,把10,20,30进栈 SeqStackPush(&p,10) ; SeqStackPush(&p,20) ; SeqStackPush(&p,30) ; while(1) printf(nt实验二nn) ; printf(n1.入栈) ; printf(n2.栈顶元素弹出) ; printf(n3.取栈顶元素) ; printf(n4.输出顺序栈中的元素) ; printf(n5.清空栈n) ; printf(t请输入要实现的功能n) ; scanf(%d,&num) ; switch
20、(num) case 1 : printf(n请输入要入栈的数:ttn) ; scanf(%d, &input) ; SeqStackPush(&p,input) ; break; case 2 : SeqStackPop(&p) ; break; case 3 : SeqStackGetTop(p) ; break; case 4 : SeqStackPrint(p) ; break; case 5 : ClearStack(&p) ; break; 五、实验结果实验三 二叉树的建立和遍历一、实验目的1、学会实现二叉树结点结构和对二叉树的基本操作。2、掌握对二叉树每种操作的具体实现,学会利用
21、递归方法编写对二叉树这种递归数据结构进行处理的算法。二、实验内容编写程序任意输入二叉树的结点个数和结点值,构造一棵二叉树,采用三种递归遍历算法(前序、中序、后序)对这棵二叉树进行遍历并计算出二叉树的高度。三、程序设计的基本思想,原理和算法描述1、数据结构的定义二叉树是另一种树型结构,它的特点是每个结点至多只有两棵子树,并且二叉树有左右之分,其次序不能任意颠倒。二叉树的存储结构分为顺序存储和链式存储结构,本次我们主要应用二叉树的二叉链表的方式存储方式,实验中首先必须对二叉树的数据结构进行定义,即定义一个二叉链表,其中其数据成员包括节点的数据、左子树的指针、右子树的指针。2、二叉树的建立在实验开始
22、前我们要建立一个以先序形式的二叉树,先序的二叉树就是先访问根结点,然后访问左子树,最后访问右子树的遍历。3、二叉树的遍历二叉树的遍历分为先序、中序、后序,需先取遍历的节点的数据存入队列中,然后输出。4、程序中要的函数的介绍(1)二叉树的类型定义(2)定义链式队列类型(3)初始化链式队列的函数(4)主函数四、源程序及注释#include#includetypedef struct BiTNodechar data; struct BiTNode *lchild,*rchild;BiTNode,*BiTree;void CreatBiTree(BiTree &T)/前序法创建二叉树 char ch
23、; if(ch=getchar()=n) T=NULL; else T=(BiTNode*)malloc(sizeof(BiTNode); if(!T) exit(1); T-data=ch; CreatBiTree(T-lchild); CreatBiTree(T-rchild); void PreTravel(BiTree &T)/前序遍历 if(T) printf(%c,T-data); PreTravel(T-lchild); PreTravel(T-rchild); void MidTravel(BiTree &T)/中序遍历 if(T) MidTravel(T-lchild); printf(%c,T-data); MidTravel(T-rchild); void PostTravel(BiTree &T
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1