数据结构实验指导书重要参考Word文档下载推荐.docx
- 文档编号:19730395
- 上传时间:2023-01-09
- 格式:DOCX
- 页数:36
- 大小:27.84KB
数据结构实验指导书重要参考Word文档下载推荐.docx
《数据结构实验指导书重要参考Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数据结构实验指导书重要参考Word文档下载推荐.docx(36页珍藏版)》请在冰豆网上搜索。
背景知识:
顺序表的插入、删除及应用。
目的要求:
1.掌握顺序存储结构的特点。
2.掌握顺序存储结构的常见算法。
实验内容
1.输入一组整型元素序列,建立顺序表。
2.实现该顺序表的遍历。
3.在该顺序表中进行顺序查找某一元素,查找成功返回1,否则返回0。
4.判断该顺序表中元素是否对称,对称返回1,否则返回0。
5.实现把该表中所有奇数排在偶数之前,即表的前面为奇数,后面为偶数。
6.输入整型元素序列利用有序表插入算法建立一个有序表。
7.利用算法6建立两个非递减有序表并把它们合并成一个非递减有序表。
8.编写一个主函数,调试上述算法。
*9.综合训练:
利用顺序表实现一个班级学生信息管理(数据录入、插入、删除、排序、查找等)
实验说明
1.算法1至算法7可以以头文件的方式存储,主函数实现该头文件的包含即可调用
2.存储定义
#defineMAXSIZE100//表中元素的最大个数
typedefintElemType;
//元素类型
typedefstructlist{
ElemTypeelem[MAXSIZE];
//静态线性表
intlength;
//表的实际长度
}SqList;
//顺序表的类型名
3.建立顺序表时可利用随机函数自动产生数据。
注意问题
1.插入、删除时元素的移动原因、方向及先后顺序。
2.解不同的函数形参与实参的传递关系。
实验二链式存储结构
(一)----单向链表的有关操作
实验学时2学时
背景知识:
单向链表的插入、删除及应用。
目的要求
1.掌握单向链表的存储特点及其实现。
2.掌握单向链表的插入、删除算法及其应用算法的程序实现。
1.随机产生或键盘输入一组元素,建立一个带头结点的单向链表(无序)。
2.遍历单向链表。
3.把单向链表中元素逆置(不允许申请新的结点空间)。
4.在单向链表中删除所有的偶数元素结点。
5.编写在非递减有序链表中插入一个元素使链表元素仍有序的函数,并利用该函数建立一个非递减有序单向链表。
6.利用算法5建立两个非递减有序单向链表,然后合并成一个非递增链表。
7.利用算法5建立两个非递减有序单向链表,然后合并成一个非递减链表。
8.利用算法1建立的链表,实现将其分解成两个链表,其中一个全部为奇数,另一个全部为偶数(尽量利用已知的存储空间)。
*9.采用单向链表实现一元多项式的存储并实现两个多项式相加并输出结果。
10.在主函数中设计一个简单的菜单,分别调试上述算法。
*11.综合训练:
利用链表实现一个班级学生信息管理(数据录入、插入、删除、排序、查找等,并能够实现将数据存储到文件中)
1.类型定义
#include<
stdio.h>
typedefstructLNode
{ElemTypedata;
structLNode*next;
}LNode,*LinkList;
2.为了算法实现简单,最好采用带头结点的单向链表。
1.重点理解链式存储的特点及指针的含义。
2.注意比较顺序存储与链式存储的各自特点。
3.注意比较带头结点、无头结点链表实现插入、删除算法时的区别。
__4.单向链表的操作是数据结构的基础,一定要注意对这部分的常见算法的理解。
实验三链式存储结构
(二)----双向链表的有关操作
实验学时2学时
双向链表的插入、删除及应用。
1.掌握双向链表的存储特点及其实现。
2.掌握双向链表的插入、删除算法及其应用算法的程序实现。
1.利用尾插法建立一个双向链表。
2.遍历双向链表。
3.实现双向链表中删除一个指定元素。
4.在非递减有序双向链表中实现插入元素e仍有序算法。
5.判断双向链表中元素是否对称若对称返回1否则返回0。
6.设元素为正整型,实现算法把所有奇数排列在偶数之前。
7.在主函数中设计一个简单的菜单调试上述算法。
双向链表的类型定义
typedefstructDuLNode
structDuLNode*prior,*next;
}DuLNode,*DuLinkList;
注意问题
注意比较单向、双向链表的特点。
_
实验四栈.队列
入栈、出栈,入队、出队。
1.掌握栈、队列的思想及其存储实现。
2.掌握栈、队列的常见算法的程序实现。
1.采用链式存储实现栈的初始化、入栈、出栈操作。
2.采用顺序存储实现栈的初始化、入栈、出栈操作。
3.采用链式存储实现队列的初始化、入队、出队操作。
4.采用顺序存储实现循环队列的初始化、入队、出队操作。
5.在主函数中设计一个简单的菜单,分别测试上述算法。
*6.综合训练:
1)利用栈实现表达式求值算法。
2)利用栈实现迷宫求解。
1.基本要求:
实现算法1、3或算法2、4即可。
2.类型定义
顺序栈示例
#defineMAX100//栈的最大值
typedef struct
{ElemType*base;
inttop;
}SqStack;
顺序队列示例
#defineMAX100//队列的最大长度
intfront,rear;
}SqQueue;
3.算法6的每个子功能尽可能写成函数形式。
1.重点理解栈、队列的算法思想,能够根据实际情况选择合适的存储结构。
2.注意算法6的各个函数之间值的传递情况。
_3.栈、队列的算法是后续实验的基础(广义表、树、图、查找、排序等)。
实验五二叉树的常见操作
二叉树的存储、建立、遍历及其应用。
1.掌握二叉树的存储实现。
2.掌握二叉树的遍历思想。
3.掌握二叉树的常见算法的程序实现。
1.输入字符序列,建立二叉链表。
2.中序遍历二叉树:
递归算法。
3.中序遍历二叉树:
非递归算法。
(最好也能实现先序,后序非递归算法)
4.求二叉树的高度。
5.求二叉树的叶子个数。
*6.将二叉链表视为森林的孩子兄弟链表,计算森林中叶子个数。
*7.建立中序线索二叉树,并实现中序遍历。
8.借助队列实现二叉树的层次遍历。
9.在主函数中设计一个简单的菜单,分别调试上述算法。
*10.综合训练:
为N个权值设计哈夫曼编码。
1.类型定义//二叉链表存储
#defineElemTypechar//元素类型
typedefstructBiTNode
structBiTNode*lchild,*rchild;
}BiTNode,*BiTree;
2.元素类型可以根据实际情况选取。
1.注意理解递归算法的执行步骤。
2.注意字符类型数据在输入时的处理。
3.重点理解如何利用栈结构实现非递归算法。
实验六图的有关操作
图的存储、遍历、及其应用。
1.掌握图的存储思想及其存储实现。
2.掌握图的深度、广度优先遍历算法思想及其程序实现。
3.掌握图的常见应用算法的思想及其程序实现。
1.键盘输入数据,建立一个有向图的邻接表。
2.输出该邻接表。
*3.建立一个无向图的十字链表。
4.在有向图的邻接表的基础上计算各顶点的度,并输出。
5.以有向图的邻接表为基础实现输出它的拓扑排序序列。
*6.采用邻接矩阵存储一个有向图,输出单源点到其它顶点的最短路径。
7.采用邻接表存储实现无向图的深度优先非递归遍历。
8.采用邻接表存储实现无向图的广度优先遍历。
*9.采用邻接矩阵存储实现无向图的最小生成树的PRIM算法。
*10.判断无向图任意两个顶点间是否有路径,若有输出路径上的顶点序列。
11.在主函数中设计一个简单的菜单,分别调试上述算法。
*12.综合训练:
为计算机专业设计教学计划:
4个学年,每学年2个学期,开设50门课程,每学期所开课程门数尽量均衡,课程的安排必须满足先修关系。
实验说明1.类型定义(邻接表存储)#defineMAX_VERTEX_NUM8//顶点最大个数typedefstructArcNode
{intadjvex;
structArcNode*nextarc;
intweight;
//边的权
}ArcNode;
//表结点#defineVertexTypeint//顶点元素类型
typedefstructVNode
{intdegree,indegree;
//顶点的度,入度VertexTypedata;
ArcNode*firstarc;
}VNode/*头结点*/,AdjList[MAX_VERTEX_NUM];
typedefstruct{AdjListvertices;
intvexnum,arcnum;
//顶点的实际数,边的实际数}ALGraph;
2.上述类型定义可以根据实际情况适当调整。
3.算法7、8分别利用栈、队列实现非递归算法。
1.注意理解各算法实现时所采用的存储结构。
2.注意区别正、逆邻接。
实验七查找的有关操作
顺序查找、树表查找、散列查找。
1.掌握折半查找算法的思想及程序实现。
2.掌握二叉排序树、AVL树的查找、插入、删除、建立算法的思想及程序实现。
3.掌握散列存储结构的思想,能选择合适散列函数,实现不同冲突处理方法的散列表的查找、建立。
1.利用实验一建立有序表,采用折半查找实现某一已知的关键字的查找。
2.随机产生一组关键字,利用二叉排序树的插入算法建立二叉排序树,然后删除某一指定关键字元素。
*3.建立AVL树并实现删除某一指定关键字元素。
4.已知散列函数为H(key)=key%p(p为自定的常数),冲突处理方法分别为线性探测法、外拉链法实现散列表的建立(利用插入算法实现)。
1.存储定义(散列表的外拉链法)
#definen9
typedefstructnode
{intkey;
structnode*next;
}NODE;
NODE*HashTable[9];
算法1、2、3可以参考顺序表,二叉链表的存储实现。
2.各种关键字数据输入可利用随机函数自动产生,以便节省上机时间。
3.算法1存储在文件seqlist.h中,算法2、3存储在文件bintree.h中,算法4存储在文件hash.h中
注意问题1.注意理解折半查找的适用条件(链表能否实现折半查找?
)。
2.注意建立二叉排序树、散列表时相同元素的处理。
3.注意理解静态查找、动态查找概念。
4.比较各种查找算法的各自特点,能够根据实际情况选择合适的查找方法。
实验八排序
各种排序方法
1.掌握常见的排序算法的思想及其适用条件。
2.掌握常见的排序算法的程序实现。
输入一组关键字序列分别实现下列排序:
1.实现简单选择排序、直接插入排序和冒泡排序。
2.实现希尔排序算法。
3.实现快速排序算法。
4.实现堆排序算法。
*5.快速排序的非递归算法。
*6.实现折半插入排序。
*7.采用链式存储实现简单选择排序、直接插入排序和冒泡排序。
8.在主函数中设计一个简单的菜单,分别测试上述算法。
*9.综合训练:
采用几组不同数据测试各个排序算法的性能(比较次数和移动次数)。
#defineMAXSIZE100/*参加排序元素的最大个数*/
typedefstructlist
}RedType;
typedefstruct{
RedTyper[MAXSIZE+1];
/*参加排序元素的实际个数*/
2.算法5可以借助栈实现。
1.在RedType中增加一个数据项验证各种排序算法的稳定性。
2.注意理解各种算法的思想、了解算法的适用情况及时间复杂度,能够根据实际情况选择合适的排序方法。
//部分算法程序示例
//实验一线性表的顺序存储结构
#include"
stdio.h"
stdlib.h"
#defineStatusint
#defineOVERFLOW0
#defineTRUE1
#defineFALSE0
#defineOK1
#defineMAXSIZE100
typedefintElemType;
{ElemTypeelem[MAXSIZE];
voidInitList(SqList&
L){
L.length=0;
}
/*建立顺序表*/
voidCreateList(SqList&
L)
{
inti;
printf("
inputthelength"
);
scanf("
%d"
&
L.length);
//输入表长
for(i=1;
i<
=L.length;
i++)
L.elem[i-1]);
//输入元素
//顺序表的遍历
voidprintdata(ElemTypee){
%4d"
e);
voidTraverse(SqListL,void(*visit)(ElemTypee))
{inti;
Theelementsofthelistsare:
\n"
i++){
if(i%10==0)printf("
//每行显示10个元素
visit(L.elem[i-1]);
//输出表中元素
//有序顺序表L中插入元素e使序列仍有序
voidInsert(SqList&
L,ElemTypee)
{inti,j;
if(L.length==MAXSIZE)exit(OVERFLOW);
//表满,不能插入
=L.length&
&
L.elem[i-1]<
=e;
i++);
//向后查找
for(j=L.length;
j>
=i;
j--)
L.elem[j]=L.elem[j-1];
//元素后移
L.elem[i-1]=e;
//插入e
L.length=L.length+1;
//表长加1
//建立递增有序的顺序表
voidCreateList_Sorted(SqList&
{inti,num;
ElemTypee;
Createasortedlist,Inputthelengthofthelist\n"
num);
Inputthedata%dnumbers\n"
num);
=num;
e);
Insert(L,e);
/*Mergetwosortedlists*/
voidMergeList(SqListLa,SqListLb,SqList&
Lc)
{int*pa,*pb,*pc;
if(La.length+Lb.length>
MAXSIZE)exit(OVERFLOW);
else
{pa=La.elem;
pb=Lb.elem;
pc=Lc.elem;
while(pa<
La.elem+La.length&
pb<
Lb.elem+Lb.length)
*pc++=(*pa<
=*pb)?
*pa++:
*pb++;
/*公共部分合并*/
La.elem+La.length)*pc++=*pa++;
/*R1表的剩余部分放到R的后部*/
while(pb<
Lb.elem+Lb.length)*pc++=*pb++;
/*R2表的剩余部分放到R的后部*/
Lc.length=La.length+Lb.length;
/*R表长*/
//判断元素是否对称,对称返回TRUE否则返回FALSE
StatusSymmetric(SqListL)
{intlow,high;
low=0;
high=L.length-1;
while(low<
high)
if(L.elem[low]==L.elem[high]){low++;
high--;
}
elsereturn(FALSE);
return(TRUE);
//顺序表的主函数部分
//#include"
seqlist.h"
voidmain()
{SqListL1,L2,L;
intselect;
do{printf("
\n1insert2merge"
\n3symmetric0exit\n"
Pleaseselect(0--3)\n"
select);
switch(select){
case1:
InitList(L);
CreateList_Sorted(L);
Traverse(L,printdata);
\nInputtheelementofinserted\n"
break;
case2:
InitList(L1);
CreateList_Sorted(L1);
Traverse(L1,printdata);
InitList(L2);
CreateList_Sorted(L2);
Traverse(L2,printdata);
MergeList(L1,L2,L);
case3:
CreateList(L);
if(Symmetric(L))printf("
Yes!
elseprintf("
Not\n"
case0:
break;
default:
printf("
Error!
Tryagain!
}while(select);
/*实验二链式存储结构
(一)----单向链表的有关操作
/*类型定义及头文件部分,文件名为sllink.h*/
stdlib.h>
//元素实际类型
typedefstructLNode{
ElemTypedata;
//定义结点、指针类型名
//头插法建立无序链表
voidCreateList(LinkList&
LinkListp;
L=(LinkList)malloc(sizeof(LNode));
L->
next=NULL;
头插法建立链表,以0结束\n"
while(e){
p=(LinkList)malloc(sizeof
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 指导书 重要 参考