数据结构c语言版实验教案

上传人:xt****7 文档编号:133214676 上传时间:2022-08-09 格式:DOC 页数:36 大小:129.50KB
返回 下载 相关 举报
数据结构c语言版实验教案_第1页
第1页 / 共36页
数据结构c语言版实验教案_第2页
第2页 / 共36页
数据结构c语言版实验教案_第3页
第3页 / 共36页
点击查看更多>>
资源描述
数据结构实验教案授课教师:许四平适用专业:信息与计算科学使用班级:13信计1、2 授课时间:2015年秋季授课学时:14学时使用教材:数据结构 严蔚敏 主编实验指导书:数据结构实验指导书,数理学院编,2012年版湖北理工学院数理学院实 验 安 排 表周次日期实验课题学时实验报告次数43.24实验一线性表的顺序存储实验(验证性)2学时143.25实验一线性表的顺序存储实验(验证性)2学时153.31 实验二单链表实验(验证性)2学时154.1实验二单链表实验(验证性)2学时164.7实验三 栈、队列(验证性)3学时164.8实验三 栈、队列(验证性)3学时1105.5实验四 树与二叉树(验证性)4学时1105.6实验四 树与二叉树(验证性)4学时113 5.26实验五 查找(验证性)3学时113 5.27实验五 查找(验证性)3学时1数据结构设计性实验项目1. 线性表的合并:已知线性表La和Lb的元素按值非递减排列。归并La和Lb得到新的线性表Lc,Lc的元素也按值非递减排列。分别采用顺序存储结构和链式结构来实现。2. 线性表的逆置:设有一个线性表(e0, e1, , en-2, en-1),请编写一个函数将这个线性表原地逆置,即将线性表内容置换为(en-1, en-2, , e1, e0)。线性表中的数据可以为整数、字符或字符串,试分别采用顺序存储结构和链式结构来实现。3. 约瑟夫环的实现:设有n个人围坐一圈,用整数序列1, 2, 3, , n表示顺序围坐在圆桌周围的人, 现从某个位置 s上的人开始报数,数到m的人出列,接着从出列的下一个人又从1开始重新报数,数到m的人出列,如此下去,直到所有人都出列为此。试设计确定他们的出列次序序列的程序。如 n=8, m=4 ,s=1时, 设每个人的编号依次为 1,2,3,开始报数,则得到的出列次序为4,8,5,2,1,3,7,6。检查程序的正确性和健壮性。(1)采用数组表示作为求解过程中使用的数据结构。(2) 采用单向循环链表作为存储结构模拟整个过程,循环链表可不设头节点,必须注意空表和非空表的界限。4. 数制转换: 利用顺序栈和链栈实现数制转换5. 二叉树的遍历:分别以顺序存储结构和二叉链表作存储结构,试编写前序、中序、后序及层次顺序遍历二叉树的算法。6. 赫夫曼树与赫夫曼编码:已知某系统在通信联络中只可能出现8种字符a,b,c,d,e,f,g,h,其概率分别为0.05,0.29,0.07,0.08,0.14,0.23,0.03,0.11,试设计Huffman编码,并计算其平均码长。(1) 初始化:从键盘读入8个字符,以及它们的权值,建立Huffman树。(2)编码:根据建立的Huffman树,求每个字符的Huffman编码。对给定的待编码字符序列进行编码。(3) 译码:利用已经建立好的Huffman树,对上面的编码结果译码。译码的过程是分解电文中的字符串,从根结点出发,按字符0和1确定找左孩子或右孩子,直至叶结点,便求得该子串相应的字符。(4) 打印Huffman树。7. 学生成绩管理查询系统:每个学生的数据信息有准考证号(主关键字)、姓名、语文、英语、数学、和总分等数据项,所有学生的信息构成一个学生成绩表。假设准考证号的头两位表示地区编号。请设计一个管理系统达到如下基本要求:(1) 初始化:建立一个学生成绩表,输入准考证号、姓名、语文、英语、数学,然后计算每个学生的总分,存入相应的数据项;注意:分析数据对象和它们之间的关系,并以合适的方式进行组织(可选择无序的顺序表、有序的顺序表或索引顺序表来进行存储表示);(2) 查找:综合应用基本查找算法完成数据的基本查询工作,并输出查询的结果;(3) 输出:有选择性地输出满足一定条件的数据记录,如输出地区编号为01,并且总分在550分以上的学生的信息;(4) 计算:计算在等概率情况下该查找表的平均查找长度。8. 排序:编制程序让机器随机产生2000个整数,放入一个数组中;对此2000个随机数序列分别用冒泡排序、快速排序、希尔排序和堆排序方法进行排序,并比较它们的运行时间。注意:每三、四个同学组成一个小组。每个实验中的题目,可分别由不同的同学完成。其它题目可以相互交流,以利于互相提高。数据结构验证性实验项目实验一 线性表的顺序存储一、实验目的及要求1、掌握在TC环境下调试顺序表的基本方法2、掌握顺序表的基本操作,插入、删除、查找、以及有序顺序表的合并等算法的实现。二、实验学时2学时三、实验任务1、 生成一个顺序表并动态地删除任意元素和在任意位置插入元素。2、 将两个有序表合并成一个有序表。四、实验重点、难点1、 在顺序表中移动元素。2、 在顺序表中找到正确的插入位置。五、操作要点 (一)顺序表基本操作的实现问题描述 当我们要在顺序表的第i个位置上插入一个元素时,必须先将顺序表中第i个元素之后的所有元素依次后移一个位置,以便腾空一个位置,再把新元素插入到该位置。若是欲删除第i个元素时,也必须把第i个元素之后的所有元素前移一个位置。基本要求 要求生成顺序表时,可以键盘上读取元素,用顺序存储结构实现存储。实现提示 要实现基本操作,可用实现的基本操作,也可设计简单的算法实现。程序实现#include #include typedef int DataType ;# define maxnum 20typedef structint datamaxnum;int length;SeqList;/*插入函数*/int insert(SeqList *L , int i , DataType x)/* 将新结点x插入到顺序表L第i个位置 */ int j ;if( i(*L).length +1) printf( n i 值不合法 ! ); return 0;if(* L).length =maxnum-1) printf( n 表满不能插入!); return 0; for(j=(*L).length;j=i;j-) (*L).dataj+1=(*L).dataj;(*L).datai = x;(*L).length+;return 1;/*删除函数*/int delete( SeqList *L ,int i) /*从顺序L中删除第i个结点*/ int j ;if( i(*L).length ) printf( n 删除位置错误 ! ) ;return 0;for(j=i+1;j=(*L).length;j+)(*L).dataj-1 =(*L).dataj;(*L).length-;return 1;/*生成顺序表*/void creatlist(SeqList * L) int n , i , j ;printf(请输入顺序表 L 的数据个数:n) ;scanf(%d , &n) ;for(i=0 ; in ; i+) printf(data%d = , i) ; scanf(%d,&(*L).datai);(*L).length=n-1;printf(n) ;/*creatlist */*输出顺序表 L*/printout(SeqList * L) int i ;for (i=0 ; i=(* L).length ; i+) printf( data%d=, i) ; printf(%d, (*L).datai);/*printout */printf(n);main() SeqList *L ;char cmd ;int i , t , x;clrscr() ;creatlist(L);doprintf(ni , I - 插入n) ;printf(d , D - 删除n) ;printf(q , Q - 退出n) ;docmd=getchar() ;while(cmd!=i)&(cmd!=I)&(cmd!=d)&(cmd!=D)&(cmd!=q)&(cmd!=Q);switch(cmd) case i: case I:printf(nPlease input the DATA: );scanf(%d,&x) ;printf(nWhere? );scanf(%d,&i) ;insert(L,i,x) ;printout(L);break ;case d:case D :printf(nWhere to Delete? );scanf(%d,&i);delete(L,i);printout(L);break ;while(cmd!=q)&(cmd!=Q);(二)有序顺序表的合并问题描述 已知顺序表la和lb中的数据元素按非递减有序排列,将la和lb表中的数据元素,合并成为一个新的顺序表lc基本要求 lc中的数据元素仍按非递减有序排列,并且不破坏la和lb表程序实现#include#include# define OK 1# define ERROR 0/* 定义ElemType为int或别的自定义类型 */typedef int ElemType;/* 链式存储类型 */typedef struct LNodeElemType data;struct LNode *next;LNode,*LinkList;/* 单链表的建立(头插法)*/void CreateList_L(LinkList &L,int n) /CreateList_L() function /To Creatre a LinkList L with HeadNode int i;LNode *p;L=(LinkList)malloc(sizeof(LNode);L-next=NULL;printf(Please input the data for LinkList Nodes: n);for(i=n;i0;-i)p=(LinkList)malloc(sizeof(LNode);scanf(%d,&p-data); /Reverse order inputing for Creating a LinkListp-next=L-next;L-next=p;/end of forif(n) printf(Success to Create a LinkList !n);else printf(A NULL LinkList have been created !n);/end of CreateList() function void MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc)LinkList pa,pb,pc;pa=La-next;pb=Lb-next;Lc=pc=La;while(pa&pb)if(pa-datadata)pc-next=pa;pc=pa;pa=pa-next;elsepc-next=pb;pc=pb;pb=pb-next;pc-next=pa?pa:pb;free(Lb);void main()LinkList La,Lb,Lc,p;int n;printf(请输入La的长度n:);scanf(%d,&n);CreateList_L(La,n);printf(输出La的内容:);p=La-next;while(p)printf(%d-,p-data);p=p-next;printf(n);printf(请输入Lb的长度n:);scanf(%d,&n);CreateList_L(Lb,n);printf(输出Lb的内容:);p=Lb-next;while(p)printf(%d-,p-data);p=p-next;printf(n);MergeList_L(La,Lb,Lc);printf(输出Lc的内容:);p=Lc-next;while(p)printf(%d-,p-data);p=p-next;printf(n);六、注意事项1、 删除元素或插入元素表的长度要变化。2、 在合并表中当某一个表到表尾了就不用比较了,直接将另一个表的元素复制到总表去即可。实验二 单链表一、实验目的及要求1、掌握用在TC环境下上机调试单链表的基本方法2、掌握单链表的插入、删除、查找、求表长以及有序单链表的合并算法的实现3、进一步掌握循环单链表的插入、删除、查找算法的实现二、实验学时2学时三、实验任务1、在带头结点的单链表h中第i个数据元素之前插入一个数据元素。2、将两个有序单链表合并成一个有序单链表。3、生成一个循环单链表。4、在循环单链表中删除一个节点。四、实验重点、难点1、 在单链表中寻找到第i-1个结点并用指针p指示。2、 比较两个单链表的节点数据大小。3、循环单链表中只有一个节点的判断条件。4、在循环单链表中删除一个节点。五、操作要点(一)单链表基本操作的实现1、实现栈的顺序存储和链式存储。#include#include# define STACK_INIT_SIZE 100# define STACKINCREMENT 10# define MAXQSIZE 100# define OK 1# define ERROR 0/* 定义SElemType为int或别的自定义类型 */typedef int SElemType;/*链式栈的存储类型*/typedef struct SNode SElemType data; struct SNode *next;SNode,*LinkStack;/*取链式栈顶元素*/int GeTop_L(LinkStack top,SElemType &e) if(!top-next) printf(Error!Its an empty LinkStack!n);return (ERROR); else e=top-next-data;return (OK); /*将元素压入链式栈*/int Push_(LinkStack top,SElemType &e) SNode *q; q=(LinkStack)malloc(sizeof(SNode); q-data=e; q-next=top-next; top-next=q; return(OK);/*将元素弹出链式栈*/int Pop_L(LinkStack top,SElemType &e)SNode *q;e=top-next-data;q=top-next;top-next=q-next;free(q);return(OK);/* 定义SElemType为int或别的自定义类型 */typedef int SElemType;/* 顺序栈的存储类型 */typedef struct/define structure SqStack() SElemType *base; SElemType *top; int stacksize;SqStack;/*构造空顺序栈*/int InitStack(SqStack &S)/InitStack() sub-function S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType);if(!S.base) printf(Allocate space failure !n);return (ERROR); S.top=S.base; S.stacksize=STACK_INIT_SIZE; return (OK); /InitStack() end/*取顺序栈顶元素*/int GetTop(SqStack S,SElemType &e)/GetTop() sub-function if(S.top=S.base) printf(Its a empty SqStack !n);/if empty SqStack return (ERROR); e=*(S.top-1); return (OK); /GetTop() end/*将元素压入顺序栈*/int Push(SqStack &S,SElemType e)/Push() sub-function *S.top+=e; return (OK); /Push() end/* 将元素弹出顺序栈*/int Pop(SqStack &S,SElemType &e)/Pop() sub-function e=*-S.top; return (OK); /Pop() end void main()int i,j;SqStack s;LinkStack s1;SElemType e;InitStack(s);s1=(LinkStack)malloc(sizeof(SNode);s1 - next = NULL;printf(顺序栈的元素:n);for(i=1;i=8;i+)scanf(%d,&e);Push(s,e);printf(顺序栈出栈:n);for(i=1;i=8;i+)Pop(s,e);printf(%d ,e);printf(n);printf(链式栈的元素:n);for(j = 1;j next)Pop_L(s1,e);printf(%d ,e);printf(n);2、利用顺序栈或链栈实现数制转换。#include#include# define STACK_INIT_SIZE 100# define STACKINCREMENT 10# define MAXQSIZE 100# define OK 1# define ERROR 0 /* 定义SElemType为int或别的自定义类型 */typedef int SElemType;/* 顺序栈的存储类型 */typedef struct/define structure SqStack() SElemType *base; SElemType *top; int stacksize;SqStack; /*构造空顺序栈*/int InitStack(SqStack &S)/InitStack() sub-function S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType);if(!S.base) printf(Allocate space failure !n);return (ERROR); S.top=S.base; S.stacksize=STACK_INIT_SIZE; return (OK); /InitStack() endint StackEmpty(SqStack S)if(S.top=S.base)return OK;elsereturn ERROR;/*取顺序栈顶元素*/int GetTop(SqStack S,SElemType &e)/GetTop() sub-function if(S.top=S.base) printf(Its a empty SqStack !n);/if empty SqStack return (ERROR); e=*(S.top-1); return (OK); /GetTop() end/*将元素压入顺序栈*/int Push(SqStack &S,SElemType e)/Push() sub-function *S.top+=e; return (OK); /Push() end/* 将元素弹出顺序栈*/int Pop(SqStack &S,SElemType &e)/Pop() sub-function e=*-S.top; return (OK); /Pop() end/*利用顺序栈实现对于输入的任意一个非负十进制整数,输出与其等值的八进制数。*/void Conversion() SqStack S; SElemType N,e; InitStack(S); scanf(%u,&N); while(N) Push(S,N%8); N=N/8; printf(Conversed to Oct.number=); while(!StackEmpty(S) Pop(S,e); printf(%d,e); printf(n); void main() Conversion(); 3、实现循环队列的存储和链队列的基本操作。 #include#include# define OK 1# define ERROR 0typedef int QElemType;/* 链队列的存储类型 */typedef struct QNode/define structure QNode QElemType data; struct QNode *next;QNode,*QueuePtr;typedef struct LinkQueue/define structure LinkQueue QueuePtr front; QueuePtr rear;LinkQueue;/*构造空链式队列*/int InitQueue(LinkQueue &Q)/InitQueue() sub-function Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode); if(!Q.front) printf(Overflow !n); return (ERROR); Q.front-next=NULL; return (OK); /InitQueue() end/* 销毁链式队列*/int DestroyQueue(LinkQueue &Q)/DestroyQueue() sub-function while(Q.front) Q.rear=Q.front-next; free(Q.front); Q.front=Q.rear; return (OK); /DestroyQueue() end/* 在链式队列尾插入新元素*/int EnQueue(LinkQueue &Q,QElemType e)/EnQueue() sub-function QNode *p; p=(QueuePtr)malloc(sizeof(QNode); if(!p) printf(Overflow !n); return (ERROR); p-data=e; p-next=NULL; if(Q.front=NULL) Q.front=Q.rear=p; return (OK); Q.rear-next=p; Q.rear=p; return (OK); /EnQueue() end/*在链式队列头删除旧元素*/int DeQueue(LinkQueue &Q,QElemType &e)/DeQueue() sub-function if(Q.front=Q.rear) printf(If it was deleted, its empty !n); return (ERROR); QNode *p; p=Q.front-next; e=p-data; Q.front-next=p-next; free(p); return (OK); /DeQueue() endvoid main()LinkQueue L;int i, n, e;if(!InitQueue(L)exit(0);printf(请输入要写入队列的元素的个数:); scanf(%d,&n); printf(请输入要写入队列的元素:); for(i = 0; itop=0; return 1;int StackEmpty(SeqStack *s) if(s-top=0) return 1; else return 0;int StackFull(SeqStack *s) if(s-top=MAXSIZE-1) return 1; else return 0; void Push(SeqStack *s,int x) if (StackFull(s) printf(the stack is overflow!n); return 0; else s-datas-top=x; s-top+; void Display(SeqStack *s) if(s-top=0) printf(the stack is empty!n); else while(s-top!=0) printf(%d-,s-datas-top); s-top=s-top-1; ElemType Pop(SeqStack *s) if(StackEmpty(s) return 0; else return s-data-s-top; ElemType StackTop(SeqStack *s) int i;if(StackEmpty(s) return 0; else i=s-top-1;return s-datai; /*返回栈顶元素的值,但不改变栈顶指针*/ main(SeqStack *p) int n,i,k,h,x1,x2,select; printf(create a empty stack!n); InitStack(p); printf(input a stack length:n); scanf(%d,&n); for(i=0;i%dn,x1); Display(p); break; case 4:x2=StackTop(p);printf(x2-%d,x2);break; (二)利用栈实现数制转换 # define MAXSIZE 100typedef int ElemType; /*将顺序栈的元素定义为整型*/typedef struct ElemType dataMAXSIZE; int top;SeqStack; void InitStack(SeqStack *s) s-top=0; return 1;int StackEmpty(SeqStack *s) if(s-top=0) return 1; else return 0;int StackFull(SeqStack *s) if(s-top=m-1) return 1; else return 0; void Push(SeqStack *s,int x) if (StackFull(s) printf(the stack is overflow!n); return 0; else s-datas-top=x; s-top+; ElemType Pop(SeqStack *s) ElemType y; if(StackEmpty(s) printf(the stack is empty!n); return 0; else y=s-datas-top; s-top=s-top-1; return y; ElemType StackTop(SeqStack *s) if(StackEmpty(s) return 0; else return s-datas-top;void Dec_to_Ocx (int N) /* n是非负的十进制整数,输出等值的八进制数*/SeqStack *S; /*定义一个顺序栈*/ElemType x; Init_SeqStack(S); /*初始化栈*/if(N0) printf(nError,The number must be over 0。); return; if(!N) Push(S,0);while(N) /*自右向左产生八进制的各位数字,并将其进栈*/ Push(S,N%8); /*余数入栈 */ N=N/8; /*商作为被除数*/ printf(Number %d converted to OCT:,N);while(StackEmpty(S) /*栈非空时退栈输出*/ x=Pop(S); printf(“%d”,x); printf(n); main( ) int n; printf(Input a number to convert to OCT:n);scanf(%d,&n);Dec_to_Ocx (n);六、注意事项1、进栈、出栈栈顶指针都要改变。 2、数制转换余数入栈后商作为被除数。七、思考题1、实现循环队列的顺序存储实验四 树与二叉树一、实验目的及要求1、进一步掌握指针变量、动态变量的含义。2、掌握二叉树的结构特性,以及各种存储结构的特点和适用范围。3、掌握用指针类型描述、访问和处理二叉树的运算。二、实验学时4学时三、实验任务1、 以二叉链表作存储结构,编写前序、中序、后序及层次顺序遍历二叉树的算法。2、 以二叉链表作存储结构,编写计算二叉树深度、所有结点总数、叶子结点数、双孩子结点个数、单孩子结点个数的算法四、实验重点、难点 1、前序、中序、后序及层次顺序遍历二叉树的算法。2、计算二叉树深度、所有结点总数、叶子结点数、双孩子结点个数、单孩子结点个数的算法。五、操作要点1、分别以顺序存储结构和二叉链表作存储结构,试编程实现前序、中序、后序及层次顺序遍历二叉树的算法。 顺序存储结构:程序代码:#include#include#define OK 1#define ERROR 0#define MAX_TREE_SIZE 100typedef char TElemType ;typedef TElemType SqBiTreeMAX_TREE_SIZE;int Create(SqBiTree & bt,int &n)/层序创建二叉树的各个节点元素cout*表示结束创建,/表示空节点endl;TElemType c;int i=0;coutc;while(c!=*)bt+i=c;cinc; n=i;cout二叉树创建完毕!endl; return OK;int LevelOrderTraverse(SqBiTree bt,int n)/层序遍历int i; for( i=1;i=n;i+) if(bti=/) continue; else if(i=n) coutbti; else coutbti; coutendl;return OK;int PreOrederTraverse(SqBiTree bt,int i,int n)/先序遍历if(i=n) if(bti!=/) coutbti; if(2*i=n) PreOrederTraverse(bt,2*i,n); if(2*i+1)=n) PreOrederTraverse(bt,2*i+1,n); return OK;int InOrederTraverse(SqBiTree bt,int i,int n)/中序遍历 if(2*i=n) InOrederTraverse(bt,2*i,n);if(i=n)if(bti!=/& i!=n ) coutbti;else if(bti!=/& i=n ) coutbti; if(2*i+1)=n) InOrederTraverse(bt,2*i+1,n); return OK;int PosOrederTraverse(SqBiTree bt,int i,int n)/后序遍历 if(2*i=n) PosOrederTraverse(bt,2*i,n); if(2*i+1)=n) PosOrederTraverse(bt,2*i+1,n);if(i=n)if(bti!=/&i!=1) coutbti; if(i=1) coutbti; return OK;void main()cout顺序存储结构二叉树endl; SqBiTree Bt; int i=1; int Length; Create(Bt,Length); cout该二叉树按层序遍历的遍历结果为:; LevelOrderTraverse(Bt,Length); coutendl按先序遍历的结果为:; PreOrederTraverse(Bt,i,Length);coutendl; coutendl按中序遍历的结果为:; InOrederTraverse(Bt,i,Length);coutendl; coutendl按后序遍历的结果为:; PosOrederTraverse(Bt,i,Length);coutendl; cout201240410111 周逊endl;运行结果:二叉链表存储结构:程序代码:#includeusing namespace std;#define ERROR 1#define OK -1typedef char TElemType;/* 二叉树节点的存储类型 */typedef struct BiTNode TElemType data;struct BiTNode *lchild,*rchild;BiTNode, *BiTree;/*建立二叉树*/int CreateBiTree(BiTree &T) TElemType ch;cinch;if(ch=#) T=NULL; else if(!(T=(BiTNode *)malloc(sizeof(BiTNode) coutdata=ch;CreateBiTree(T-lchild);/create lchildCreateBiTree(T-rchild); /create rchildreturn (OK);int PreOrderTraverse(BiTree T)/PreOrderTravers sub-function if(T) coutdata; /visite Tif (PreOrderTraverse(T-lchild)/traverse lchildif (PreOrderTraverse(T-rchild)/traverse rchildreturn (OK);return (ERROR); /if endelsereturn (OK); /PreOrderTraverse() endint InOrderTraverse(BiTree T)/InOrderTraverse sub-function if(T) if (InOrderTraverse(T-lchild)/traverse lchild coutdata;/visite Tif(InOrderTraverse(T-rchild)/traverse rchildreturn (OK);return (ERROR); /if endelsereturn (OK); /InOrderTraverse() endint PostOrderTraverse(BiTree T)/PostOrderTraverse() sub-function if(T) if (PostOrderTraverse(T-lchild) /traverse lchildif(PostOrderTraverse(T
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!