运算机数据结构实验指导.docx
- 文档编号:24944018
- 上传时间:2023-06-03
- 格式:DOCX
- 页数:18
- 大小:81.97KB
运算机数据结构实验指导.docx
《运算机数据结构实验指导.docx》由会员分享,可在线阅读,更多相关《运算机数据结构实验指导.docx(18页珍藏版)》请在冰豆网上搜索。
运算机数据结构实验指导
数据结构实验一C语言结构体与指针
一、实验目的
巩固温习前期所学C语言的函数参数传递、指针和结构体等知识点,增强学习数据结构语言基础。
二、实验内容
1.实现病历查询功能。
具体要求如下:
概念一个结构体描述病人病历信息(病历号,姓名,病症);完成功能如下:
1)输入功能:
输入5个病人的信息;
2)查询功能:
输入姓名,在5个病历中进行查找,若是找到那么显示该人的信息,若是没有找到,那么显示“查无这人”。
假设病历类型名为patient,要求利用指针,并利用以下两个函数(函数的实现自行完成):
voidreadin(patient*p);//用来输入病人信息。
voidsearch(patient*p,char*x);//依照姓名查询病人病历信息,并打印出来。
提示:
请注意输入函数的用法。
2.设计一个函数,计算S=1-2+3-4+5-6+……+/-N的值,并计算你所设计的函数的时刻复杂度。
三、实验源代码
此处写程序源代码,请在程序中适当注释,便于教师更快地看懂你的程序。
四、实验结果
此处写出程序运行的结果,即输入数据是什么,输出数据是什么,分析结果是不是正确,若是不正确是什么缘故。
五、实验心得
此处写出完成此实验后有什么收成,碰着什么因难,又是如何解决的。
请不要写“这门课好难学”、“一点也可不能”之类的话语,因为这对你学习并无帮忙。
关键是通过实验发觉自己可不能的知识点,然后攻克它!
数据结构实验二顺序表的运用
一、实验目的
一、把握成立顺序表的大体方式。
二、把握顺序表的插入、删除算法的思想和实现,并能灵活运用
二、实验内容
用顺序表实现病历信息的治理与查询功能。
具体要求如下:
1.利用教材中概念顺序表类型存储病人病历信息(病历号,姓名,病症);要求利用头文件。
2.设计顺序表定位查找算法,完成的功能为:
在线性表L中查找数据元素x,若是存在那么返回线性表中和x值相等的第1个数据元素的序号;若是不存在,那么返回-1。
函数概念为intListFind(SequenceListL,char*x)
请在主函数中测试查找是不是存在姓名为x的病人,并依照返回的序号打印出病人信息。
数据结构实验三有序单链表
一、【实验目的】
一、把握成立单链表的大体方式。
二、把握单链表的插入、删除算法的思想和实现
二、【实验内容】
仿照教材中的单链表实现例子,自己设计一个有序单链表,单链表中的数据元素为整型并递增有序。
有序单链表的概念:
逻辑结构:
有序线性表,数据元素递增有序
存储结构:
链式
操作集合:
初始化、插入、删除、撤销
(1)ListInitiate(L)初始化线性表,生成一个空表L。
(2)ListInsert(L,x)在有序表L中插入数据元素x,使得新表仍然有序。
(3)ListDelete(L,x)删除有序表L中的数据元素x,假设删除成功那么返回1,不成功那么返回0。
(4)Destroy(L)撤销单链表
要求:
1.有序单链表的操作集合有如下操作:
初始化、插入、删除、撤销,利用头文件单链表的代码。
2.编写主函数main()验证所设计的有序单链表是不是能正确插入、删除。
提示:
1.插入操作时,从链表的第一个数据元素结点开始,逐个比较每一个结点的data域值和x的值,当data小于等于x时,进行下一个结点的比较;不然就找到了插入结点的适合位置,现在申请新结点把x存入,然后把新结点插入;当比较到最后一个结点仍有data小于等于x时,那么把新结点插入单链表尾。
2.删除操作时,从链表的第一个数据元素结点开始,逐个比较每一个结点的data域值和x的值,当data小于等于x时,进行下一个结点的比较;不然就找到了要删除的结点,删除结点后释放结点。
若是到了表尾尚未找到值为x的结点,那么链表中没有要删除的元素。
实验四线性表综合应用
一、【实验目的】
一、把握线性表的两种存储结构的灵活运用。
二、【实验内容】
约瑟夫环(Josephus)问题的求解
具体描述是:
设有编号为1,2,……,n的n(n>0)个人围成一个圈,从第K个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起从头报数,报到m时停止报数,报m的出圈,……,如此下去,直到所有人全数出圈为止。
当任意给定n和m后,设计算法求n个人出圈的顺序。
请依照以上描述,选择适合的存储结构,完成约瑟夫环的求解。
请打印出出圈人的序号。
提示:
约瑟夫环问题要紧可分解为建环、删除两个操作。
可利用课上给出的头文件。
三、实验源代码
实验五栈
一、实验目的:
1.把握堆栈的存储方式和大体操作
2.把握堆栈后进先出运算原那么在解决实际问题中的应用
二、实验内容:
1.利用栈结构,编写程序将十进制数转换成二进制数或八进制数。
说明:
十进制数值转换成二进制利用辗转相除法将一个十进制数值转换成二进制数值。
即用该十进制数值除以2,并保留其余数;重复此操作,直到该十进制数值为0为止。
最后将所有的余数反向输出确实是所对应的二进制数值。
十进制数值转换成八进制算法类似。
转换算法要求用一个函数完成。
算术表达式中许诺包括两种括号:
圆括号和方括号,其嵌套的顺序随意,即([][])或[([]())]等为正确格式,而[(]或()))或[())均为不正确的格式。
请利用栈结构,写一算法查验某表达式中的括号是不是匹配,并测试你的算法是不是正确。
测试表达式为:
(1)[(1+2)*3-1]+[((1+2]*3)-1]
(2)[(1+2)*3-1]+[(1+2)*3-1]
三、实验源代码
四、实验结果
五、实验心得
实验六队列
一、实验目的
1.把握队列的顺序存储结构
2.把握队列先进先出运算原那么在解决实际问题中的应用
二、实验内容
仿照教材顺序循环队列的例子,设计一个只利用队头指针和计数器的顺序循环队列抽象数据类型。
其中操作包括:
初始化、入队列、出队列、判定队列是不是非空。
编写主函数,验证所设计的顺序循环队列的正确性。
以下是队列操作函数的概念:
(1)QueueInitiate(Q)初始化队列Q
(2)QueueNotEmpty(Q)队列Q非空否
(3)QueueAppend(Q,x)入队列,在队列Q的队尾插入数据元素x。
(4)QueueDelete(Q,d)出队列,把队列Q的队头元素删除并由参数d带回。
提示:
队尾的位置可由队头指针与计数器进行求解,请试探它们之间的关系,同时还要考虑如何实现循环队列(可借助求模运算)。
三、实验源代码
四、实验结果(测试数据)
五、实验心得
数据结构实验七栈和队列的应用
一、实验目的
一、把握顺序堆栈的类型概念方式。
二、把握顺序堆栈上实现的几种大体操作。
3、把握顺序队列的类型概念方式。
4、把握顺序队列上实现的几种大体操作。
二、实验内容
设计算法判定一个字符序列是不是是回文,要求采纳队列和堆栈结构。
提示:
设字符数组str中寄存了要判定的字符串。
把字符数组中的字符逐个别离存入队列和堆栈,然后逐个出队列和退栈并比较出队列的字符和退栈的字符是不是相等,假设全数相等那么该字符序列是回文,不然就不是回文。
三、实验源代码
四、实验结果
实验八串的应用
一、【实验目的】
一、把握串的顺序存储结构
二、把握顺序串的大体操作方式(插入、删除等)。
3、把握Brute-Force算法
二、【实验内容】
一、编写函数BFIndex(StringS,intstart,StringT),实现Brute-Force算法,其中S为主串,start为子串在主串中的查找位置,T为子串。
程序可参考书本例子。
二、设串采纳静态数组存储结构,编写函数实现串的替换Replace(S,start,T,V),即要求在主串S中,从位置start开始查找是不是存在子串T。
假设主串S中存在子串T,那么用子串V替换子串T,且函数返回1;假设主串S中不存在子串T,那么函数返回0。
并要求设计主函数进行测试。
(以下是部份代码,请同窗自己完善)
#include
#defineMaxSize100
typedefstruct
{
charstr[MaxSize];
intlength;
}String;
intInsert(String*S,intpos,StringT)
/*在串S的pos位置插入子串T*/
{
inti;
if(pos<0)
{
printf("参数pos犯错!
");
return0;
}
elseif(S->length+T.length>MaxSize)
{
printf("数组空间不足无法插入!
");
return0;
}
else
{
for(i=S->length-1;i>=pos;i--)
S->str[i+T.length]=S->str[i];/*为插入做准备*/
for(i=0;i S->str[pos+i]=T.str[i];/*插入*/ S->length+=T.length;/*产生新的元素个数*/ return1; } } intDelete(String*S,intpos,intlen) { inti; if(S->length<=0) { printf("数组中未寄存字符无元素可删! \n"); return0; } elseif(pos<0||len<0||pos+len>S->length) { printf("参数pos和len犯错"); return0; } else { for(i=pos+len;i<=S->length-1;i++) S->str[i-len]=S->str[i];/*依次前移*/ S->length-=len;/*产生新的长度值*/ return1; } } 主程序 #include #include #defineMaxlength100 #include"SString.h" intBFIndex(String*S,intstart,StringT) {自己完成} intReplace(String*s,intstart,Stringt,Stringv) {自己完成} voidmain(void) { StringmyString1,myString2,myString3; inti,start=0; printf("请输入主串myString1\n"); scanf("%s",myString1.str); printf("请输入子串myString2\n"); scanf("%s",myString2.str); printf("请输入子串myString3\n"); scanf("%s",myString3.str); myString1.length=strlen(myString1.str); myString2.length=strlen(myString2.str); myString3.length=strlen(myString3.str); if(Replace(&myString1,start,myString2,myString3)==0) printf("不成功\n"); else for(i=0;i printf("%c",myString1.str[i]); } 三、【实验源代码】 四、【实验结果】 五、【实验心得】 实验九数组的应用 一、【实验目的】 一、把握数组的抽象数据类型 二、把握动态数组的设计方式 3、明白得动、静态数组的对照 4、把握特殊矩阵的紧缩存储及运算 五、把握稀疏矩阵的紧缩存储 二、【实验内容】 一、设矩阵A、矩阵B和矩阵C为n阶对称矩阵,矩阵元素为整数类型,要求: (1)假设A、B和C采纳紧缩存储方式,请编写函数实现矩阵加法运算C=A+B的函数 (2)编写紧缩矩阵的元素输出函数,按矩阵格式输出。 (3)以下面的数据为测试例子,编写一个主程序挪用以上两个函数进行测试,输出矩阵A,B,C。 三、【实验源代码】 四、【实验结果】 五、【实验心得】 数据结构实验十递归算法的实现 一、实验目的 1、把握递归原理 2、把握一些经常使用问题的递归算法设计 二、实验内容 1.有如此一个故事: 猴子第一天摘下假设干个桃子,当即吃了一半,还只是瘾,又多吃了一个。 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。 以后天天早上都吃了前一天剩下的一半零一个。 到第10天早上想再吃时,见只剩下一个桃子了。 那么你明白猴子第一天共摘了多少个桃子吗? 1)请用递归和非递归算法别离实现猴子吃桃问题的求解。 2)求解进程请用函数实现。 要求能够计算: 若是在第N天只剩下一个桃子了,那么第一天共摘了多少个桃子。 2.编写折半查找算法的递归实现和非递归实现。 提示: 将要查找的元素key与查找区间正中元素相较,假设key小,那么查找区间缩小至前半部份查找,假设key大,那么查找区间缩小至后半部份查找;再取其中值比较,每次缩小1/2的范围,直到查找成功或失败为止。 如递归实现,考虑函数的参数应有哪些。 在用循环结构实现时,函数的参数有什么转变? 三、实验源代码 四、实验结果 数据结构实验十一二叉树的成立及遍历应用 一、【实验目的】 一、把握二叉树的成立方式 二、把握二叉树遍历的大体方式(前序、中序、后序) 3、把握递归二叉树遍历算法的应用 二、【实验内容】 1.构造一棵二叉树,树的形态如以下图所示,打印出前序遍历、中序遍历、后序遍历的遍历序列。 A BF CG DE 2.选择一种遍历方式计算该树中叶子结点的个数,并打印出叶子结点。 三、【实验源代码】 四、【实验结果】 五、【实验心得】 实验十二二叉树的层序遍历 一、【实验目的】 一、把握二叉树遍历的大体方式(前序、中序、后序、层序) 二、【实验内容】 一、二叉树如下,请完成: A BF CG DE 要求: (1)编写一个按层次(同一层自左至右)输出二叉树中所有的结点的函数。 (2)编写测试主函数。 实验十三哈夫曼编码的程序设计 一、【实验目的】 一、把握哈夫曼树的成立进程 二、熟悉哈夫曼编码的实现 二、【实验内容】 设有字符集{A,B,C,D},各字符在电文中显现的次数集为{1,3,4,7};要求 编程实现哈夫曼树的构造,并在此基础上编程实现哈夫曼编码. 三、实验源代码 四、实验结果(树结构及编码表) 数据结构实验十四图的操作实现 一、实验目的 一、 明白得图的存储结构与大体操作; 二、 把握图的创建进程 二、实验内容 依照下图,采纳邻接矩阵的存储结构保留此图,并打印出邻接矩阵。 图的创建代码参考教材P217页例9-1. 提示: 第一依照给出的图结构得出该图的极点集和边集,挪用相应的函数生成图的邻接矩阵,并打印出邻接矩阵。 三、【实验源代码】 四、【实验结果】 五、【实验心得】 实验十五图的遍历的实现 一、【实验目的】 一、 把握图的遍历进程; 二、 明白得图的存储结构与大体操作; 3、熟悉图的广度优先遍历的实现 二、【实验内容】 (1) 采纳邻接矩阵的存储结构保留教材P202的图(a)无向图; (2) 编程实现该图的深度与广度优先遍历。 三、实验源代码 四、实验结果(打印遍历的顺序) 实验十六排序算法的实现 一、【实验目的】 (1)明白得各类排序算法的实现进程; (2)明白得不同排序算法的时刻复杂度及适用环境; (3)了解算法性能测试的大体方式。 二、【实验内容】 (1)以下是一个通过随机数来测试排序算法运行时刻的程序,中间留出了加入排序算法的部份。 其中能够通过修改RANDNUM的值来更改测试的数据量: #include"stdio.h" #include #include #include #defineRANDNUM20000//随机数的个数 voidmain() { intiRandNum[RANDNUM];//寄存随机数 time_tfirst,second;//记录开始和终止时刻(以毫秒为单位) inti; for(i=0;i {//产生1万个随机数 iRandNum[i]=rand()%RANDNUM; } first=clock();//开始时刻 //此处加入排序程序 second=clock();//终止时刻 } (2)从所学的排序算法中任选四种排序算法进行测试,记录运行时刻; (3)把需排序的数改成20000,进行一样测试,并比较测试结果。 提示: 在程序的实现进程中要用到以下函数,请大伙儿在实验之前自学这几个函数的用法: 1)随机函数rand() 2)时刻函数clock() 三、实验源代码 四、实验结果 记录测试结果。 实验十七动态查找算法的实现 一、【实验目的】 一、把握二叉排序树的大体概念 二、把握二叉排序树的大体算法(查找算法、插入算法、删除算法) 二、明白得并把握二叉排序数查找的平均查找长度。 二、【实验内容】 一、已知一个个数为12的数据元素序列为{Dec,Feb,Nov,Oct,June,Sept,Aug,Apr,May,July,Jan,Mar},要求: (1)按各数据元素的顺序(字母大小顺序)构造一棵二叉排序数,并中序打印排序结果。 (2)查找数据”Sept”是不是存在。 三、【实验源代码】 四、【实验结果】 五、【实验心得】
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 运算 数据结构 实验 指导