ImageVerifierCode 换一换
格式:DOCX , 页数:72 ,大小:35.75KB ,
资源ID:10428387      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10428387.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(10数据结构实验指导书朱素英.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

10数据结构实验指导书朱素英.docx

1、10数据结构实验指导书朱素英 数据结构 实验指导书朱素英 编 写适用专业: 计算机科学与技术 计算机网络工程 湖南人文科技学院计算机科学技术系2008 年 8 月前 言数据结构课程是计算机科学与技术专业的一门必修的专业基础课。这门课程的主要特点是实践性很强,不仅要学习基本理论知识,更要注重上机实践,通过上机实践验证算法的正确性,掌握和巩固所学理论知识。通过对本课程中算法设计和上机实践的训练,培养学生的数据抽象能力和程序设计的能力,为后续课程,特别是软件课程打下坚实的知识基础。要求学生掌握各种常用数据结构的逻辑结构,存储结构及有关操作的算法。通过本课程的学习,要求学生了解数据结构及其分类、数据结

2、构与算法的密切关系; 熟悉各种基本数据结构及其操作,学会根据实际问题要求来选择数据结构; 掌握设计算法的步骤和算法分析方法; 掌握数据结构在排序和查找等常用算法中的应用。为了使学生更好地理解和深刻地把握这些知识,并在此基础上,训练和培养了解数据结构及其分类、数据结构与算法的密切关系; 熟悉各种基本数据结构及其操作,学会根据实际问题要求来选择数据结构; 掌握设计算法的步骤和算法分析方法; 掌握数据结构在排序和查找等常用算法中的应用等方面的技能,设置的以下十二个的具体实验项目,这些实验项目中有验证性实验、综合性实验与设计性实验,在每一个具体实验中都有标明。各项实验主要了解、掌握的具体知识,在每个实

3、验中都有说明。本实验指导书对计算机科学与技术专业与网络工程专业均适应。目录(顺序表的基本操作 栈的基本操作 队列的基本操作 串的模式匹配 二叉树的基本操作 哈夫曼树与哈夫曼编码)实验一:顺序表的基本操作 1实验二:单链表的基本操作 9实验三:栈的基本操作 14实验四:队列的基本操作 16实验五:串的模式匹配 19实验六:矩阵的基本运算 22实验七:二叉树的基本操作 29实验八:哈夫曼树与哈夫曼编码 34实验九:图的最短路径算法 38实验十:哈希表的基本操作 40实验十一:各种排序算法 44实验十二:银行模拟 48实验一:顺序表的基本操作实验学时:2实验类型:验证 实验要求:选修一、实验目的1掌

4、握使用VC+进行控制台应用程序编写的基本方法2掌握顺序表的初始化、销毁、数据元素的插入和删除以及顺序表的输出等基本操作。二、实验内容顺序表的初始化、插入和删除三、 程序清单1、运行环境Visual c+ 6.0的微机一台2、程序清单/线性表的顺序结构算法实现 #include stdio.h #include stdlib.h # define OVERFLOW -2 # define OK 1 #define ERROR 0 /数据类型说明 typedef int ElemType; typedef int Status; # define List_init_size 100/线性表存储空

5、间初始分配量# define Listincrement 10/线性表存储空间分配增量typedef struct ElemType *elem; /存储空间基址 int length; /当前长度 int listsize;/当前分配的存储容量 / (以sizeof(ElemType)为单位)sqlist;/初始化线性表:Status InitList(sqlist &L) /构造一个空线性表L L.elem=(ElemType *) malloc(List_init_size*sizeof(ElemType); if (!L.elem) exit(OVERFLOW); L.length=0

6、; L.listsize= List_init_size; return OK;/在一个空的线性表中输入N个数据:Status sqlistinput(sqlist &L,int n)int i=0; if(nL.listsize)return ERROR; for(;in;i+) scanf(%d,&L.elemi); L.length=n; return OK; /判线性表是否为空Status ListEmpty(sqlist L)if (!L.length) return ERROR; else return OK; /求线性表的长度Status ListLength(sqlist L)

7、 return L.length; /将线性表L 的数据输出:Status sqlistoutput(sqlist L)int i; for(i=0;iListLength(L);i+) printf(%4d,L.elemi); printf(n); return OK; /取线性表的第i个元素,其结果保存在e中Status GetElem(sqlist l,int i,ElemType &e) if (il.length+1) return ERROR; e=l.elemi-1; return OK; /定义两个数据元素相等的比较函数Status equal(ElemType e1,Elem

8、Type e2)if (e1=e2) return OK; else return ERROR; /根据compare()函数在线性表中定位元素e的位置int LocateElem_sq(sqlist L,ElemType e,Status (*compare)(ElemType,ElemType) /成功返回位序,否则返回0 int i=1; ElemType *p; p=L.elem; while(i=L.length &!(*compare)(*p+,e) +i; if (i=L.length) return i; else return 0;/ locateElem_sq/在线性表中求

9、某元素的前趋结点,如存在则返回其前趋结点pre_e的值,否则返回出错信息Status PriorElem(sqlist L,ElemType cur_e,ElemType &pre_e) int pos; pos=LocateElem_sq(L,cur_e,equal); if(pos=0) return ERROR; else if(pos=1) return OVERFLOW; /overflow 表示位于第一个 else GetElem(L,pos-1,pre_e); return OK; /在线性表中求某元素的后继结点Status NextElem(sqlist L,ElemType

10、cur_e,ElemType &next_e) int pos; pos=LocateElem_sq(L,cur_e,equal); if(pos=0) return ERROR; else if(pos=L.length) return OVERFLOW; /overflow 表示最后一个 else GetElem(L,pos+1,next_e); return OK; /在线性表中插入一个元素Status Listinsert_sq(sqlist &L,int i,ElemType e) ElemType *p,*q,*newbase; if (iL.length+1) return ER

11、ROR; if (L.length=L.listsize) newbase=(ElemType *) realloc(L.elem, (L.listsize+Listincrement) *sizeof(ElemType); if (!newbase) exit(OVERFLOW); L.elem=newbase; L.listsize+=Listincrement ; q=&(L.elemi-1); for(p=&(L.elemL.length-1);p=q;-p) *(p+1)=*p; *q=e; +L.length; return OK;/ listinsert_sq;/在线性表中删除第

12、i个元素,其结果保留在e中Status Listdelete_sq(sqlist &l,int i,ElemType &e) ElemType *p,*q; if (il.length+1) return ERROR; p=&(l.elemi-1); e=*p; q=l.elem+l.length-1; for(+p;p=q;+p) *(p-1)=*p; -l.length; return OK;/ listdelete_sq;/将la和lb线性表归并到lcvoid mergelist_sq(sqlist la,sqlist lb,sqlist &lc) ElemType *pa,*pb,*p

13、c,*pa_last,*pb_last; pa=la.elem; pb=lb.elem; lc.listsize=lc.length=la.length+lb.length; pc=lc.elem=(ElemType*)malloc(lc.listsize*sizeof(ElemType); if (!lc.elem) exit(OVERFLOW); pa_last=la.elem+la.length-1; pb_last=lb.elem+lb.length-1; while (pa=pa_last)& (pb=pb_last) if (*pa=*pb) *pc+=*pa+; else *pc

14、+=*pb+ ; while(pa=pa_last) *pc+=*pa+; while(pb=1;i-) for(j=0;jL.elemj+1) t=L.elemj; L.elemj=L.elemj+1 ; L.elemj+1=t; return OK; void main()sqlist la,lb,lc; int n,m,i,e,k,cur_e,pre_e,next_e; /建立线性表,并输入输出线性表的数据 InitList(la);InitList(lb); printf(please input las numbers:n(请输入线性表la的元素个数n)n); scanf(%d,&n

15、); printf(please input la n numbers:( 请输入线性表la的n个元素)n); sqlistinput(la,n); sqlistoutput(la); printf(n); /调用插入函数,对线性表进行插入操作 printf(请输入要插入的元素的位置和插入的值 n); scanf(%d%d,&i,&e); Listinsert_sq(la,i,e); sqlistoutput(la); /调用删除函数,对线性表进除删操作 printf(请输入要删除的元素的位置n); scanf(%d,&i); Listdelete_sq(la,i,e); printf(the

16、 dele data is %dn,e); sqlistoutput(la); printf(please input the get datas locaten); scanf(%d,&i);/调用GetElem()函数,取第I个位置的元素的值。 GetElem(la,i,e); printf(the get data is %dn,e); printf(please input the locateelems data :cur_en);/调用LocateElem_sq()函数,求元素cur_e的位置。scanf(%d,&cur_e); k=LocateElem_sq(la,cur_e,e

17、qual); printf(the locate is %dn,k); /调用PriorElem()函数,求元素cur_e的前驱。 printf(please input the cur_e datan); scanf(%d,&cur_e); PriorElem(la,cur_e,pre_e); printf(the pre_e is %dn,pre_e); /调用NextElem()函数,求元素cur_e的后继。 printf(please input the cur_e datan); scanf(%d,&cur_e); NextElem(la,cur_e,next_e); printf(

18、the next_e is %dn,next_e); /建立两个线性表并排序然后归并 printf(please input lbs numbers:mn); scanf(%d,&m); printf(please input lb m numbers:n); sqlistinput(lb,m); printf(n); sqlistoutput(lb); sortsqlist(la); printf(the sort list la is:n); sqlistoutput(la); sortsqlist(lb); printf(the sort list lb is:n); sqlistout

19、put(lb); mergelist_sq(la,lb,lc); printf(la and lbs mergelist is:n); sqlistoutput(lc);四、思考题1如何实现顺序表的逆置2每次删除操作时,都会使得大量的数据元素移动,删除多个数据元素时,就需多次移动数据元素。能否一次进行删除多个数据元素的操作,使得数据元素的移动只进行一次。实验二:单链表的基本操作实验学时:2实验类型:验证 实验要求:必修一、 实验目的1定义单链表的结点类型。2熟悉对单链表的一些基本操作和具体的函数定义。3通过单链表的定义掌握线性表的链式存储结构的特点。4掌握循环链表和双链表的定义和构造方法二、实

20、验内容链表的创建、插入与删除操作三、程序清单1、运行环境装有Visual c+6.0的微机一台2、程序清单/链表的创建及插入、删除操作#include stdio.h#includestdlib.h#define NULL 0#define error 0#define ok 1#define overflow -2#define infeasible -1/类型定义typedef int Status;typedef int ElemType;/定义链表的存储结构typedef struct LNodeint data; /数据域 struct LNode *next; /指针域 LNode

21、,*LinkList; /链表的类型Status GetElem_l(LinkList L, int i , ElemType &e)/L为带头结点的单链表,当第i 个元素存在时,其值赋给e.int j;LinkList p ;p=L-next; j=1;while(p&jnext; +j;if(!p|ji) return error;e=p-data;return ok;/逆序创建链表 void CreatList_L1(LinkList &L,int n) /n为元素个数,L为头结点 int i; LinkList p; L=(LinkList)malloc(sizeof(LNode);

22、/生成头结点 L-next=NULL; for(i=n;i0;i-) /链头插入法 p=(LinkList)malloc(sizeof(LNode); scanf(%d,&p-data); p-next=L-next; L-next=p; /正序创建单链表void CreatList_L2(LinkList &L,int n ) /n为元素个数,L为头结点int i ; LinkList p,q; L=(LinkList )malloc(sizeof(LNode);q=L;for(i=0;idata); q-next=p; q=p; q-next=NULL;/输出链表void print(Li

23、nkList L)LinkList p; p=L-next; while(p) printf(%d ,p-data); p=p-next; /链表的插入操作int ListInsert(LinkList &L,int i,int e)LinkList p,s;int j; p=L;j=0; while(p&jnext; +j; if(!p|ji-1) return error; s=(LinkList)malloc(sizeof(LNode); s-data=e; s-next=p-next; p-next=s; return ok; /链表的删除操作 int ListDelete(LinkL

24、ist &L,int i,int &e) LinkList p,q; int j; p=L; j=0; while(p-next&jnext; +j; if(!(p-next)|ji-1) return error; q=p-next;p-next=q-next; e=q-data;free(q); return ok; /对链表的元素进行排序Status sortlinklist(LinkList &L)LinkList p,q,r; ElemType t;p=L-next; /p指向链表第一个元素结点while(p-next!=NULL) q=L-next; /q指向链表第一个元素结点 w

25、hile(q-next!=NULL) r=q-next; if(q-datar-data) /相邻两个元素比较、交换 t=q-data; q-data=r-data; r-data=t; q=q-next; p=p-next; return ok ;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-data data) pc-next=pa;pc=pa;pa=pa-next; else p

26、c-next=pb;pc=pb;pb=pb-next;pc-next=pa?pa:pb;free(lb);/主函数通过调用创建、插入、删除用输出函数完成链表的基本操作void main()LinkList L1,L2,L3; int n,ins,del,i;/创建一个先进先出单链表 printf(please input fifo linklists node number n:n); scanf(%d,&n); printf(please input the linklist %d nodes data n,n); CreatList_L2(L2,n); print(L2); printf(

27、n);/创建一个后进先出单链表printf(please input lifo linklists node number n:n); scanf(%d,&n); printf(please input the linklist %d nodes data n,n); CreatList_L1(L1,n); print(L1); printf(n);/对链表进行插入操作 printf(please input the insert nodes locate i and value en); scanf(%d%d,&i,&ins); ListInsert(L1,i,ins); print(L1); printf(n);/对链表进行删除操作 printf(please input the delete nodes locate in); scanf(%d,&i); ListDelete(L1,i,del); print(L1); printf(n%dn,del);/对链表进行排序sortlinklist(L1);printf(n the L1 lists sort is:n);print(L1);printf(n the L2 lists sort is:n);

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1