收藏 分享(赏)

数据结构报告.doc

上传人:HR专家 文档编号:11532740 上传时间:2020-06-05 格式:DOC 页数:40 大小:242KB
下载 相关 举报
数据结构报告.doc_第1页
第1页 / 共40页
数据结构报告.doc_第2页
第2页 / 共40页
数据结构报告.doc_第3页
第3页 / 共40页
数据结构报告.doc_第4页
第4页 / 共40页
数据结构报告.doc_第5页
第5页 / 共40页
点击查看更多>>
资源描述

1、湖南师范大学工程与设计学院数据结构实验报告姓 名: 沈毕年 级: 2014专 业: 应用电子技术学 号: 201430181029任课教师:肖柳明开课时间:20152016学年第一学期实验(一)实验时间2015年实验地点中栋603实验题目线性表的存储及操作实验目的1) 掌握顺序存储结构和链式存储结构的特点;2) 掌握常见算法。实验内容实验内容:已知两个按元素值有序的线性表A和B,编程实现:将A和B有序归并成一个按元素值有序的线性表。实验步骤:1) 从键盘输入两个按元素值有序的线性表A和B的值;2) 根据输入把数据元素分别以顺序存储结构和线性链表存储;3) 有序归并成一个新的按元素值有序的线性表

2、C;4) 输出显示合并后的线性表C。测试数据:A=(3,5,8,11),B=(2,6,8,9,11,15,20) 一、 结构定义:typedef int ElemType;typedef int Status;顺序存储结构的定义:typedef struct ElemType *elem; int length; int listsize;SqList;线性链表结构的定义:typedef struct LNode ElemType data; struct LNode *next;LNode, *LinkList;二、 算法描述:先将两个表的元素从键盘输入,然后再将两个表相加,得到第三个表。在

3、合并后的表中找到值相同的元素,将后面的元素前移以删除值相同的元素,最后将表的长度减1得到最终的结果。/顺序表LA,LB合为LCSqlist MergeList_sq(Sqlist La,Sqlist Lb, Sqlist Lc) pa=La.elem,pb=Lb.elem,*pc;pa_last=La.elem+La.length-1;pb_last=Lb.elem+Lb.length-1;Lc.listsize=Lc.length=La.length+Lb.length;pc=Lc.elem=(int *) malloc(Lc.listsize*sizeof(int);if(!Lc.elem

4、) /分配失败exit(0);while(pa=pa_last&pb=pb_last) /判断La,Lb是否结尾if(*pa=*pb) /比较大小,影响插入的顺序*pc+=*pa+;else*pc+=*pb+;while(pa=pa_last) /可能存在没有插完的情况*pc+=*pa+;while(pbnext; pb=Lb-next;Lc=pc=La;while(pa&pb) if(pa-datadata) pc-next=pa;pc=pa;pa=pa-next;else pc-next=pb; pc=pb;pb=pb-next;pc-next=pa?pa:pb;free(Lb);retu

5、rn Lc;三、 程序清单:#include #include struct int *elem; int length; int listsize; A,B,C;struct node int data; struct node *next; *HA,*HB,*HC;void del_order() int i,j; for(i=0;iC.listsize-1;i+) if(C.elemi=C.elemi+1) for(j=i+2;j=C.listsize-1;j+) C.elemj-1=C.elemj; C.listsize-; printf(n删除后线性表C的值:n); for(i=0;

6、iC.listsize;i+) printf(%d ,C.elemi); merge_order() int i=0,j=0,k=0; C.listsize=A.listsize+B.listsize; C.elem=(int *)malloc(C.listsize*sizeof(int); if(C.elem=NULL) return 0; while(iA.listsize&jB.listsize) if(A.elemiB.elemj) C.elemk+=A.elemi+; else C.elemk+=B.elemj+; while(iA.listsize) C.elemk+=A.elem

7、i+; while(jB.listsize) C.elemk+=B.elemj+; printf(线性表C的值为:n); for(k=0;kC.listsize;k+) printf(%d , C.elemk); del_order();creat_order() int i; printf(请输入线性表A和表B的长度:n); scanf(%d%d,&A.listsize,&B.listsize); A.length=A.listsize; B.length=B.listsize; A.elem=(int *)malloc(A.listsize*sizeof(int); B.elem=(int

8、 *)malloc(B.listsize*sizeof(int); if(A.elem=NULL|B.elem=NULL) return 0; printf(请有序输入线性表A的值n); for(i=0;iA.listsize;i+) scanf(%d,&(A.elemi); printf(请有序输入线性表B的值n); for(i=0;idatadata) q-next=HA; HA=HA-next; else q-next=HB; HB=HB-next; q=q-next; while(HA!=NULL) q-next=HA; HA=HA-next; q=q-next; while(HB!=

9、NULL) q-next=HB; HB=HB-next; q=q-next; q=NULL; printf(线性表C的值为:n); for(q=HC-next;q!=NULL;q=q-next) printf(%d ,q-data); creat_list() struct node *p,*q; int la,lb; printf(n请输入线性表A和B的长度:n); scanf(%d%d,&la,&lb); HA=p=(struct node *)malloc(sizeof(struct node); if(p=NULL) return ; printf(请输入线性表A的值:n); whil

10、e(la-0) scanf(%d,&p-data); q=p; p=(struct node *)malloc(sizeof(struct node); q-next=p; q-next=NULL; HB=p; printf(请输入线性表B的值:n); while(lb-0) scanf(%d,&p-data); q=p; p=(struct node *)malloc(sizeof(struct node); q-next=p; q-next=NULL; merge_list(); main() char ch;GO:printf(a:顺序存储nb:线性链表n); ch=getchar();

11、 if(ch=a) creat_order(); else if(ch=b) creat_list(); else goto GO;四、 运行结果:五、 分析与总结:时间复杂度:O(n)空间复杂度:O(1)这是第一次上数据结构实验课,虽然之前学过C语言,可是真到了自己编写程序的时候,还是不知道该从何下手,编写的过程中更是错误连连,开始没有使用#define定义,根本就无法运行,后来出来了一个简单的结果,成就感还是有的。然后继续在现有程序上进行改进,最后出来了这个结果。编写程序还是需要耐心,注意大小写,中文括号之类的小问题,再多看书,基本就能编出简单的程序,最后在现有程序上进行改进,就能一步步做

12、好。实验(二)实验时间2015年实验地点中栋604实验题目栈、队列实验目的1) 掌握栈、队列的思想及其存储实现;2) 掌握栈、队列的常见算法的程序实现及应用。实验内容实验内容:1) 利用栈和算符优先算法,实现表达式求值。 2) 采用顺序存储实现循环队列的初始化、入队、出队操作。测试数据:(1)3595(63)3)循环队列大小为11,d,e,b,g,h入队;d,e出队;i,j,k,l,m入队;b出队;n,o,p,q,r入队一、结构定义:栈: #define STACK_INIT_SIZE 100#define STACKINCREMENT 10typedef struct int *base;

13、int *top; int stacksize; SqStack;队列:typedef struct QNode int data; struct QNode *next; QNode,*QueuePtr; typedef struct QueuePtr front; QueuePtr rear; LinkQueue;2、 算法描述:(一)、算术表达式算法基本思想:1、 首先置操作数栈为空栈,表达式起始符#为运算符栈的栈底元素。2、 依次读入表达式中每个字符,若是操作数则进OPND栈,若是运算符则和OPTR栈顶运算符比较优先权后进行相应的操作,直至整个表达式求值完毕(即OPTR栈的栈顶元素和当

14、前读入的字符均为#。operandType evaluateExpression()/算术表达式求值的算符优先算法。设OPTR和OPND分别为运算符栈和运算数栈/OP为运算符号的集合InitState(OPTR); Push(OPTR,#);InitState(OPND); c = getchar();While( c != # | getop(OPTR) != # )If ( !In(c,OP)/当前输入若为运算数则压入OPND栈Push (OPND,c);c = getchar();Else Switch (Precede (getop(OPND),c)/比较输入运算符和运算符栈顶元素的优

15、先级大小 Case :/弹出OPTR栈顶元素和OPND的两个栈顶元素进行运算并将结果入OPND栈 Pop(OPTR,theta); /弹出OPTR栈顶元素Pop(OPND,b);Pop(OPND,a); / 弹出OPND的两个栈顶元素 Push (OPND,Operate(a,theta,b);/ 进行运算并将结果入OPND栈 Break; Return GeTop(OPND); /返回运算结果,此时OPND的栈顶元素即为最终运算结果。二)、队列/ 构造一个空队列Qint InitQueue(SqQueue *Q)Q-base=(QElemType *)malloc(MAXQSIZE*size

16、of(QElemType);if(!Q-base) / 存储分配失败exit(0);Q-front=Q-rear=0;/下标初始化为0return 1;/ 返回Q的元素个数,即队列的长度int QueueLength(SqQueue Q)return(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;/ 插入元素e为Q的新的队尾元素int EnQueue(SqQueue *Q,QElemType e)if(Q-rear+1)%MAXQSIZE=Q-front) / 队列满return 0;Q-baseQ-rear=e;Q-rear=(Q-rear+1)%MAXQSIZE;re

17、turn 1; / 若队列不空,则删除Q的队头元素,用e返回其值,并返回1;否则返回0int DeQueue(SqQueue *Q,QElemType *e)if(Q-front=Q-rear) / 队列空return 0;*e=Q-baseQ-front;Q-front=(Q-front+1)%MAXQSIZE;return 1;3、 程序清单:栈#include #include #include /OPND栈struct ND int *base; int *top; int size;OPND;/OPTR栈 struct TR char *base; char *top; int si

18、ze;OPTR;/构建OPND空栈 struct ND InitStack_ND(struct ND *S) S-base=(int *)malloc(10*sizeof(int); S-top=S-base; S-size=1;/构建OPTR空栈 struct TR InitStack_TR(struct TR *S) S-base=(char *)malloc(10*sizeof(char); S-top=S-base; S-size=1;/用e返回OPND栈的顶元素struct ND TOP_ND(struct ND *S,int *e)/if(S-base=S-top) /return

19、 0; *e=*(S-top-1); /用e返回OPTR栈的顶元素struct TR TOP_TR(struct TR *S,char *e)/if(S-base=S-top) /return 0; *e=*(S-top-1);/在OPND栈中插入estruct ND PUSH_ND(struct ND *S,int e)*(S-top)=e;+(S-top); /在OPTR栈中插入estruct TR PUSH_TR(struct TR *S,char e) *(S-top)=e;+(S-top); /删除OPND顶栈struct ND POP_ND(struct ND *S,int *e)

20、/if(S-base=S-top) /return 0; -(S-top); *e=*(S-top);/删除OPTR顶栈struct TR POP_TR(struct TR *S,char *e)/if(S-base=S-top) /return 0; -(S-top); *e=*(S-top); /运算符优先级char Precede(char a,char b) int i,j; char c77= , , , , , , ,=0&c=9); zi=0; d=C(z); PUSH_ND(&OPND,d); else switch(Precede(x,c) case :/ 退栈并将运算结果入

21、栈 POP_TR(&OPTR,&theta); POP_ND(&OPND,&b); POP_ND(&OPND,&a); /delete PUSH_ND(&OPND,Operate(a,theta,b); break; TOP_TR(&OPTR,&x); TOP_ND(&OPND,&d); return d; main() int c; printf(请输入要计算的表达式,以字符#结束:n); c=Expression(); printf(Result=%dn,c); 队列#include #include struct Node char *elem; int lenght; int fron

22、t; int rear;Q;/创建队列 InitQueue() printf(请输入队列Q的长度:n); scanf(%d,&Q.lenght); Q.elem=(char *)malloc(Q.lenght*sizeof(char); Q.front=Q.rear=1; /队列情况 input_Queue() int i=Q.front; printf(n此时队列长为%dn,(Q.rear-Q.front+Q.lenght)%Q.lenght); printf(n此时队列Q中的情况为:n); while(i!=Q.rear) printf(%c ,Q.elemi); i=(i+1)%Q.le

23、nght; /入队 enqueue(char *s) while(*s!=0) if(Q.rear+1)%Q.lenght=Q.front) printf(队列已满,不能入队n); return ; Q.elemQ.rear=*s; Q.rear=(Q.rear+1)%Q.lenght; s+; /出队DeQueue(int num) if(Q.front=Q.rear) printf(n队列为空n); return ; printf(n出队的数据为:n); while(num!=0) if(Q.front=Q.rear) printf(队列为空n); return ; printf(%c ,

24、Q.elemQ.front); Q.front=(Q.front+1)%Q.lenght; num-; C() char s20; int b; int a; InitQueue(); while(b) printf(请选择1.入队 2.出队 0.结束n); scanf(%d,&b); if(b=1) printf(n请输入要入队的数据:n); scanf(%s,&s); enqueue(s); input_Queue(); printf(n); else if(b=2) printf(请输入出队数据个数:n); scanf(%d,&a); DeQueue(a); input_Queue();

25、 printf(n); else if(b=0) return 0; else printf(请重新输入n); main() C();四、 运行结果:五、分析与总结: 时间复杂度:O(n)空间复杂度:O(1)用栈来做算式的运算最重要的就是排好不同运算符之间的优先级关系,如果OPND栈和OPTR栈做好了的话基本就很简单了,只需要注意进栈和出栈不要出错即可。实验(三)实验时间2015年实验地点中栋604实验题目二叉树的常见操作实验目的1) 掌握二叉树的存储实现。 2) 掌握二叉树的遍历思想。 3) 掌握二叉树的常见算法的程序实现。实验内容1) 输入字符序列,建立二叉链表。 2) 求先序、中序和后序

26、遍历序列,并显示输出。 3) 求二叉树的深度,并显示输出 。 4) 求二叉树的结点总数,并显示输出。 测试数据:输入字符序列ABCDEGF一、结构定义#include #include #include #define charchartypedef struct BiTNode char data; BiTNode *lchild,*rchild;*BiTree;二、算法描述void CreateBiTree(BiTree *T) / 创建树TElemType ch;scanf(%c,&ch);if(ch=Nil) / 空*T=NULL;else*T=(BiTree)malloc(sizeo

27、f(BiTNode);if(!*T)exit(0);(*T)-data=ch; / 生成根结点CreateBiTree(&(*T)-lchild); / 构造左子树CreateBiTree(&(*T)-rchild); / 构造右子树/ 返回T的深度int BiTreeDepth(BiTree T)int i,j;if(!T)return 0;if(T-lchild)i=BiTreeDepth(T-lchild);/递归求深度elsei=0;if(T-rchild)j=BiTreeDepth(T-rchild);elsej=0;return ij ? i+1 : j+1;/ 先序递归遍历T,对

28、每个结点调用函数Visit一次且仅一次void PreOrderTraverse(BiTree T,int(*Visit)(TElemType)if(T) / T不空Visit(T-data); / 先访问根结点PreOrderTraverse(T-lchild,Visit); / 再先序遍历左子树PreOrderTraverse(T-rchild,Visit); / 最后先序遍历右子树/ 中序递归遍历T,对每个结点调用函数Visit一次且仅一次void InOrderTraverse(BiTree T,int(*Visit)(TElemType)if(T)InOrderTraverse(T-

29、lchild,Visit); / 先中序遍历左子树Visit(T-data); / 再访问根结点InOrderTraverse(T-rchild,Visit); / 最后中序遍历右子树 / 后序递归遍历T,对每个结点调用函数Visit一次且仅一次int PostOrderTraverse(BiTree T,int(*Visit)(TElemType)/ 返回结点个数if(T) / T不空PostOrderTraverse(T-lchild,Visit); / 先后序遍历左子树PostOrderTraverse(T-rchild,Visit); / 再后序遍历右子树; / 最后访问根结点int m;m=Visit(T-data);return m;三、程序清单#i

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

当前位置:首页 > 实用文档 > 工作总结

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报