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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

数据结构实验指导书.docx

1、数据结构实验指导书数据 结 构 实 验指 导 数 据 结 构实验指导南昌大学计算机系2011年3月前 言数据结构是计算机程序设计的重要理论技术基础,不仅是计算机学科的核心课程,而且己成为其它理工专业的热门选修课程。数据结构课程主要研究信息的逻辑结构及其基本操作在计算机中的表示和实现,其教学要求之一是训练学生进行复杂程序设计的技能和培养良好程序设计的习惯,但由于这门课程相对抽象且内容复杂,因此,在数据结构的整个教学过程中,辅助课堂教学的实验非常有助于帮助学生学好这门课程,培养学生独立思考和解决问题的能力,锻炼学生的动手能力,希望能对我校的数据结构教学工作有所帮助。目 录实验1:C+ 语言基础练习

2、 1实验2:线性表及其应用 4实验3:栈和队列 12实验4:串及其应用 14实验5:数组 16实验6:二叉树及其应用 18实验7:图的应用 20实验8:查找、排序 22附录:实验报告格式 24实验1:C+ 语言基础练习一、实验目的对C+语言的复习,增强学生对结构体数组和指针的学习,尤以结构体的应用和指针的操作, 还有C+中类作为重点。二、问题描述1、 构造一个学生结构体数组,成员包括学号,姓名,四门成绩,以及平均成绩;2、 从键盘上输入学生的学号,姓名和四门成绩;3、 找出学生中考试没有通过的学生姓名并输出;找出考试在90分以上的学生并输出。三、实验要求1、 要求用链表存储学生的记录,并设计出

3、输入和查找的基本操作算法。2、 在实验过程中,分析算法的时间复杂度和空间复杂度进行分析。四、实验环境PC微机DOS操作系统或 Windows 操作系统Turbo C 程序集成环境或 Visual C+ 程序集成环境五、实验步骤1、用所选择的语言实现算法;3、 测试程序,并对算法进行时间和空间复杂度分析。六、实验报告要求实验报告应包括以下几个部分:1、 问题描述;2、 测试结果的分析与讨论,在测试过程中遇到的主要问题及采取的解决措施。3、 设计与实现过程中的体会,进一步的改进设想。4、 实现算法的程序清单,应有足够的注释。【算法实现】#define m 4 /*每个学生所学习课程数*/#defi

4、ne NULL 0typedef struct stnode int id; /*学号*/ char name16; /*姓名*/ int class4; /*所有课程成绩分别存储在class0,class1,class2,中*/ float ave; /*学生个人所有课程的平均成绩*/ struct stnode *next; /*指针域*/ students; students *head; /*head 为指向学生单链表的头指针,且为全局变量*/ int n; /*参加成绩管理的班上的学生个数*/ average() /*求每门课程的平均成绩的函数*/ int i,j; /*i为课程数,

5、j为学生数*/ float sum,aver; students *p; printf(Class Average resultn); printf(*Class*Class Average*n); for(i=0;inext) /*求某一门课程的所有学生的得分总和*/ sum=sum+p-classi; p=p-next; j+; aver=sum/j; /*求某一门课程的平均分*/ printf( Class%d %16.2fn,i+1,aver); printf(*nn); nopass() /*找含有课程不及格的学生,如有则输出它的学号、姓名、所有课程成绩、它的所有课程的平均分*/ i

6、nt i,j; students *p; p=head; /*从第1个结点开始查找*/ printf(NO Pass resultn); /*输入不格的结果*/ printf(*ID*Name*Class*Average*n); while(p-next) /*最后一个结点无数据,不用输出*/ i=0; while(iclassiid,p-name); /*输出不及格学生的学号、姓名*/ for(i=0;iclassi); printf(%8.2fn,p-ave); break; else i+; /*查找该同学的下一门课程*/ p=p-next; /*查找下一个同学*/ printf(*nn

7、); over90( ) /*查找所有课程个人平均分在90分以上(包含90分)的学生,如有则输出该学生的学号*/ students *p; p=head; /*从表头开始查找*/ while(p-next) /*直到倒数第二个结点为止 ,倒数第一个结点数据*/ if(p-ave=90.0) /*找到则输出该学生的学号*/ printf(n); printf(average over 90 its id is %dn,p-id); p=p-next; else /*否则查找下一个结点*/ p=p-next; main() students *p,*q; int i,j; float sum; c

8、lrscr(); printf(please student num!n); scanf(%d,&n); /*n为学生个数*/ head=(students *)malloc(sizeof(students); q=head; for(i=0;iid); /*输入学生的学号*/ scanf(%s,&p-name); /*输入学生姓名*/ printf(n); printf(input student%i its scoren,i+1); for(j=0;jclassj); q=(students *)malloc(sizeof(students); q-next=NULL; p-next=q;

9、 p=head; while(p-next) /*求每个学生个人所有课程的平均成绩*/ sum=0; for(j=0;jclassj; p-ave=sum/m; p=p-next; average(); nopass(); over90();实验2:线性表及其应用一、实验目的帮助学生掌握线性表的基本操作在顺序和链表这两种存储结构上的实现,尤以链表的操作和应用作为重点。二、问题描述1、 构造一个空的线性表L。2、 在线性表L的第i个元素之前插入新的元素e;3、 在线性表L中删除第i个元素,并用e返回其值。三、实验要求1、 分别利用顺序和链表存储结构实现线性表的存储,并设计出在不同的存储结构中线性

10、表的基本操作算法。2、 在实验过程中,对相同的操作在不同的存储结构下的时间复杂度和空间复杂度进行分析。四、实验环境PC微机DOS操作系统或 Windows 操作系统Turbo C 程序集成环境或 Visual C+ 程序集成环境五、实验步骤 1、用学生选择的语言,设计出线性表的顺序和链表存储结构; 2、设计出这两种存储结构下的线性表的插入、删除算法;4、 用所选择的语言实现算法;5、 测试程序,并对不同存储结构下的算法分析。六、实验报告要求实验报告应包括以下几个部分:1、 问题描述;2、 设计两种存储结构与核心算法描述;3、 测试结果的分析与讨论,在测试过程中遇到的主要问题及采取的解决措施。4

11、、 设计与实现过程中的体会,进一步的改进设想。5、 实现算法的程序清单,应有足够的注释。七、思考题1、 如何设计和实现基本线性表在两种存储结构下就地逆置算法?2.1 实现基本线性表的运算【算法实现】#define null 0typedef int ElemType;typedef struct node ElemType data; /*数据域*/ struct node *next; /*指针域*/Lnode; /*定义基本线性表的结点类型*/Lnode *head; /*定义指向基本线性表的表头指针为全局变量*/ int length (Lnode *p) /*求指针p指向的基本线性表的

12、长度*/ int n=0; /*结点位置计数器*/ Lnode *q=p; /*临时指针q*/ while (q!=null) /*当基本线性表不空时,统计基本线性表中的结点数*/ n+; q=q-next; return(n); /*返回统计的结点数*/ElemType get(Lnode *p,int i) /*求指针p指向的基本线性表中的第i个结点的值*/ int j=1; /*查找结点位置的计数器*/ Lnode *q=p; /*定义临时指针 q*/ while (jnext; j+; if(q!=null) /*如果存在,则返回其数据域的值*/ return(q-data); els

13、e /*否则,输出“位置参数不正确”*/ printf(位置参数不正确!n);int locate(Lnode *p,ElemType x) /*求指针p指向的基本线性表中的数据元素x的位置序号*/ int n=0; /*结点位置计数器*/ Lnode *q=p; /*定义临时指针 q*/ while (q!=null&q-data!=x) /*在基本线性表中查找数据元素x的位置*/ q=q-next; n+; if(q=null) /*如果不存在,则返回-1*/ return(-1); else /*否则返回结点的位置序号*/ return(n+1);void insert(ElemType

14、 x,int i) /*在基本线性表的位置i,插入数据元素x*/ int j=1; /*结点位置计数器*/ Lnode *s,*q; /*定义临时指针变量p, q*/ s=(Lnode *)malloc(sizeof(Lnode); /*生成新结点*/ s-data=x; /*并将新结点的数据域置为x*/ q=head; if(i=1) /*如果插入位置是1,则将新结点插入到表头*/ s-next=q; head=s; else /*否则,查找插入位置*/ while(jnext!=null) q=q-next; j+; if(j=i-1) /*将新结点插入到位置i*/ s-next=q-ne

15、xt; q-next=s; else /*插入位置不存在*/ printf(位置参数不正确!n); void delete(Lnode *p,int i) /*将指针p指向的基本线性表中的位置i的数据元素删除*/ int j=1; /*结点位置计数器*/ Lnode *q=p,*t; if(i=1) /*如果位置序号为1,则将基本线性表的第1个数据元素结点删除*/ t=q; p=q-next; else /*否则从表头查找相应的位置序号i*/ while(jnext!=null) q=q-next; j+; if(q-next!=null&j=i-1) /*如果找到位置i,则将该位置的结点删除

16、*/ t=q-next; q-next=t-next; else /*否则位置i不存在*/ printf(位置参数不正确!n); if(t!=null) free(t);void display(Lnode *p) /*将指针p指向的基本线性表输出*/ Lnode *q; q=p; printf(单链表显示: ); if(q=null) printf(链表为空!); else if (q-next=null) /*如果基本线性表只有单个结点,则将其数据域输出*/ printf(%dn,q-data); else /*否则,逐个输出所有结点的数据域*/ while(q-next!=null) p

17、rintf(%d-,q-data); q=q-next; printf(%d,q-data); printf(n);main() Lnode *q; int d,i,n,select,k,flag=1; clrscr(); head=null; printf(请输入数据长度: ); scanf(%d,&n); for(i=1;i=n;i+) printf(将数据插入到单链表中: ); scanf(%d,&d); insert(d,i); display(head); printf(n); while(flag) printf(1- 求长度 n); printf(2- 取结点 n); print

18、f(3- 求值查找 n); printf(4- 增加结点 n); printf(5- 删除结点 n); printf(6- 退出 n); printf(input your select: ); scanf(%d,&select); switch(select) case 1: d=length(head); printf(n单链表的长度为:%d ,d); printf(n); display(head); printf(n); break; case 2: printf(n请输入取得结点的位置: ); scanf(%d,&d); k=get(head,d); printf(%dn,k); d

19、isplay(head); printf(n); break; case 3: printf(n请输入要查找的数据: ); scanf(%d,&d); k=locate(head,d); printf(%dn,k); display(head); printf(n); break; case 4: printf(n请输入增加结点的位置:); scanf(%d,&k); printf(n请输入增加结点的数据:); scanf(%d,&d); insert(d,k); display(head); printf(n); break; case 5: printf(n请输入删除结点的位置: ); s

20、canf(%d,&d); delete(head,d); printf(n); display(head); printf(n); break; case 6: flag=0; break; 2.2 基本线性表的就地逆置【算法实现】(1)顺序结构基本线性表的就地逆置算法实现。#define max 20 /*基本线性表中的最多元素个数为20*/typedef int datatype;typedef struct node datatype datamax; int length;sqlist; /*将基本线性表类型定义为sqlist 类型*/ sqlist p1; /*定义p1为基本线性表类

21、型*/void reverlist() /*将顺序存储结构的基本线性表就地逆置*/ int i; for(i=0;ip1.length/2;i+) /*数据元素交换的次数为p1.length/2*/ p1.datap1.length+1=p1.datai; /*将第length+1个存储单元作为中间存储单元*/ p1.datai=p1.datap1.length-1-i; /*将相应位置的元素前后交换*/ p1.datap1.length-1-i=p1.datap1.length+1; main() int j; clrscr(); p1.length=0; printf(please inp

22、ut 10 datan); for(j=0;j10;j+) /*创建初始基本线性表*/ scanf(%d,&p1.dataj); p1.length+; printf(the sqlist is:n); for(j=0;j10;j+) /*将创建成功的基本线性表输出*/ printf(%4d,p1.dataj); printf(nn); reverlist( ); /*将基本线性表逆置*/ printf(the result is:nn); for(j=0;j10;j+) /*将逆置后的基本线性表输出*/ printf(%4d,p1.dataj);(2)链式存储结构基本线性表的就地逆置算法实现

23、。#include #define null 0#define LEN sizeof(struct stu)#define elemtype int typedef struct stu /*定义结点结构体类型*/ elemtype data; /*数据域*/ struct stu *next; /*指针域*/Llist;Llist *creatlist(int n) /*创建一个含 n 个结点的链表*/ Llist *head=NULL, *p; int i; for(i=0;idata); /*对新结点的数据域赋值*/ if(i=0) /*创建链式基本线性表的头结点*/ head=p; h

24、ead-next=null; else /*创建链式基本线性表中的其他结点*/ p-next=head; head=p; return(head);void printlist ( Llist *head) /*输出链表中各结点信息*/ Llist *p; p=head; printf(基本线性表为: n); while(p!=NULL) printf(%d-,p-data); p=p-next; Llist *reverlist(Llist *head) /*逆置链式基本线性表*/ Llist *p,*q; if(head&head-next) /*当链式基本线性表中有两个以上的结点时,进行

25、逆置*/ p=head; /*指针p指向指针head所指向的链式基本线性表*/ q=p-next; /*指针q指向链式基本线性表的第2个结点*/ p-next=null; /*在第1个结点与第2个结点间断开,原来的链式基本线性表变成两个链式基本线性表,分别由指针head和指针q指向*/ while(q) /*每次将指针q指向链表的第1个结点,插入到指针head指向链式基本线性表的最前面*/ p=q; q=q-next; p-next=head; head=p; return(head);main() Llist *head=NULL,*p; int n,num; clrscr(); printf(input number of node:); /*输入链式基本线性表的结点数*/ scanf(%d,&n); head=creatlist(n); /*创建链式基本线性表*/ printf(nn逆置前); printlist(head); /*输出创建成功的链式基本线性表*/ printf(

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2