数据结构实验指导与课程设计教程陈建新 李志敏上Word文档下载推荐.docx
《数据结构实验指导与课程设计教程陈建新 李志敏上Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数据结构实验指导与课程设计教程陈建新 李志敏上Word文档下载推荐.docx(19页珍藏版)》请在冰豆网上搜索。
![数据结构实验指导与课程设计教程陈建新 李志敏上Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2023-1/22/073e9977-da4e-47b9-a974-0b5c9b34ccf2/073e9977-da4e-47b9-a974-0b5c9b34ccf21.gif)
/*线性表定义*/
3、功能(函数)设计
顺序表的基本操作:
InitList(SqList&
L)/*初始化操作,将线性表L置空*/
CreatSqlist(SqList&
L,intn)/*建立一个顺序存储的线性表*/
Output(SqListL)/*输出顺序表L*/
IsEmpty(SqListL)/*判断表是否为空。
如果L是空表,返回,否则返回*/
GetElem(SqListL,inti)/*取表中第i元素。
*/
LocateElem(SqListL,ElemTypex)
/*定位函数。
返回L中第个与x相等的数据元素的位置(从算起)。
否则返回值为。
Insert(SqList&
L,ElemTypex,inti)
/*在线性表L中第i(≤i≤L.length)个数据元素之前插入一个数据元素x*/
Dlete(SqList&
L,inti)
/*删除线性表L中第i(≤I<
L.length)个数据元素*/
Clear(SqList&
L)/*清空线性表L*/
MergeList(SqListla,SqListlb,SqList&
lc)
/*合并表有序表la和lb到表lc中,使得lc依然有序*/
4、界面设计
指导用户按照正确的格式输入数据。
5、编码实现
实验二链式存储实验
理解链表的逻辑结构和存储结构,熟练掌握链表的相关操作。
链表是用一组任意的存储单元来依次存储线性表中的各个数据元素,这些存储单元可以是连续的,也可以是不连续的。
用链接存储结构表示线性表的一个元素时至少要有两部分信息:
一是这个数据元素的值,二是这个数据元素的直接后继的存储地址。
这两部分信息一起组成了链表的一个结点。
数据域用来存放数据元素的值;
指针域(又称链域)用来存放该数据元素的直接后继结点的地址。
链表正是通过每个结点的指针域将线性表的n个结点按其逻辑次序链接成为一个整体。
通常用箭头表示链域中的指针,于是单链表就可以直观地画成用箭头链接起来的结点序列,单链表中每个结点的存储地址存放在其直接前驱的指针域中,因此访问单链表的每一个结点必须从表头指针开始进行。
对单链表的操作主要有:
建立单链表、查找(按序号查找、按值查找)、插入一个结点、删除一个结点、求表长等。
单链表的结点结构如下:
typedefstructnode
{/*单链表结点结构*/
ElemTypedata;
/*ElemType可以是任何相应的数据类型如int,char等*/
structnode*next;
}LinkList;
链表的基本操作:
InitList1(LinkList*&
head)
//初始化不带头结点的链表头指针
AddHead1(LinkList*&
head,ElemTypex)
//使用表首添加法,向头指针为head的链表中插入一个结点,其值为x
InitList(LinkList*&
//初始化带头结点的链表头指针
AddHead(LinkList*head,ElemTypex)
//使用表尾添加法,向头指针为head的链表中插入一个结点,其值为x
CreatList(LinkList*head,intn)
//生成含有n个结点的单链表
output(LinkList*head)
//输出单链表
GetNode(LinkList*head,inti)
//在带头结点的单链表中查找第i个结点,找到返回该结点指针,否则返回NULL
LocateNode(LinkList*head,ElemTypex)
//在带头结点的单链表中查找值为x的结点,找到返回结点指针,否则返回NULL
InsertNode(LinkList*head,inti,ElemTypex)
//在带头结点的单链表中第i个结点位置上插入值为x的结点
DeleteNode1(LinkList*head,ElemTypex)
//在带头结点的单链表中删除值为x的结点
DeleteNode(LinkList*head,inti)
//在带头结点的单链表中删除第i个结点
Length(LinkList*head)
//在带头结点的单链表中求表的长度
InsertOrder(LinkList*head,intx)
//在有序单链表L中插入值为x的结点,插入后仍然有序
union1(LinkList*head,LinkList*B,LinkList*&
C)
//A和B是两个带头结点的递增有序的单链表,本算法将两表合并成,一个带头结点的递增有序单链表C,利用原表空间。
(见源代码)
6、运行测试
建立链表,输入相关数据,测试各功能函数。
实验三顺序栈实验
理解顺序栈的逻辑结构和存储结构,熟练掌握顺序栈的相关操作。
栈是限制为仅仅能在表的一端插入和删除的线性表,是生活中某些过程的抽象。
插入删除的的一端称为栈顶(Top)、插入操作通常称为进栈或者入栈(Push)。
不能插入删除的一端称为栈底(Bottom)、删除操作通常称为出栈或者退栈(Pop)。
依据栈的定义,栈顶的元素总是最后进栈的,并且是最先出栈的;
栈底元素正好相反,最先进栈,最后出栈,因此,栈有着后进先出(LastInFirstOut—LIFO)的特性,也称为后进先出表。
使用顺序表来表示一个栈。
顺序栈的数据类型:
#defineMaxSize100/*最大元素个数*/
typedefstruct/*顺序栈的类型定义*/
{ElemTypedata[MaxSize];
/*栈元素存储空间*/
inttop;
/*栈顶指针*/
}SeqStack;
顺序栈基本操作:
StackInitial(SeqStack*pS)//创建一个由指针pS所指向的空顺序栈
IsEmpty(SeqStack*pS)//顺序栈为空时返回,否则返回
IsFull(SeqStack*pS)//栈为满时返回,否则返回
Push(SeqStack*pS,ElemTypee)//若栈不满,则元素e进栈
Pop(SeqStack*pS)//若栈不为空,则删除栈顶元素,并返回它的值
GetTop(SeqStack*pS)//若栈不为空,则返回栈顶元素的值
MakeEmpty(SeqStack*pS)//将由指针pS所指向的栈变为空栈
运行程序,输入顺序表的数据,建立顺序栈,测试各功能函数。
实验四链式栈实验
理解链式栈的逻辑结构和存储结构,熟练掌握链式栈的相关操作。
问题描述同前面的顺序栈,这里是使用一个链表来表示一个栈。
使用带表头结点的链表,这样所有对栈的初始化和判断条件都需要作相应的更改。
链式栈的数据类型:
typedefstructstackNode/*链栈结点的类型定义*/
{ElemTypedata;
/*数据域*/
structstackNode*next;
/*指针域*/
}StackNode;
typedefstruct/*链栈的类型定义*/
{
StackNode*top;
/*栈顶指针*/
}LinkStack;
链式栈基本操作:
功能函数同前面的顺序栈。
输入相关数据,建立链表,以链表作为栈,测试各功能函数。
实验五顺序循环队列实验
理解顺序队列的逻辑结构和存储结构,熟练掌握顺序队列的相关操作。
队列是限制为仅仅能在表的一端插入和另一端删除的线性表,是生活中排队的抽象。
插入的一端称为队尾(Rear)、插入操作通称进队(Enqueue);
删除的一端称为队头(Front)、删除操作通称出队(Dequeue)。
队列是有着先进先出(FirstInFirstOut—FIFO)的特性,也称为先进先出表。
这里是采用顺序存储结构来实现的队列为顺序队列。
队列的顺序存储结构也是利用一维数组来依次存放从队尾到队头的元素。
设置front来指示队列当前队头元素的位置、rear来指示队列当前队尾元素的位置。
顺序队列随着插入和删除操作的进行,队头和队尾标志顺序向后移动,当元素被插入到数组中的最高位置上之后,队列的空间就用完了,数组的低端还有许多空闲空间,但已经无法插入,这种现象通称为顺序队列的“假溢出”。
为解决顺序队列的“假溢出”,可以将存储队列的数组看作是首尾相连的循环结构(循环队列)。
循环队列判满和空的条件:
front永远指向队头元素的前一个位置,队列中有一个元素空间不可用,队空判断条件:
rear==front,队满判断条件:
(rear+1)%MaxSize==front。
顺序循环队列的数据类型:
#defineMaxSize100/*最大元素个数*/
typedefstruct/*顺序循环队列的类型定义*/
/*队列元素存储空间*/
intfront;
/*队头指针*/
intrear;
/*队尾指针*/
}CircSeqQueue;
顺序循环队列基本操作:
QueueInitial(CircSeqQueue*pQ)
//创建一个由指针pQ所指向的空顺序循环队列
IsEmpty(CircSeqQueue*pQ)
//顺序循环队列为空时返回1,否则返回0
IsFull(CircSeqQueue*pQ)
//循队列为满时返回1,否则返回0
EnQueue(CircSeqQueue*pQ,ElemTypee)
//若队列不满,则元素e进队
DeQueue(CircSeqQueue*pQ)
//若循环队列不为空,则删除队头元素,并返回它的值
GetFront(CircSeqQueue*pQ)
//若队列不为空,则返回队头元素的值
MakeEmpty(CircSeqQueue*pQ)
//将由指针pQ所指向的队列变为空队
输入数据,建立顺序循环队列,测试各功能函数。
实验六链式队列实验
理解链式队列的逻辑结构和存储结构,熟练掌握链式队列的相关操作。
队列的链式存储结构通常也是采用单链表表示,结点同样包括数据域和指针域。
由于队列需要固定在链表的头部删除和尾部插入,所以将链表的表头作为队头时,删除极为方便,为了方便在链表尾部的插入,需要增加一个指针指向尾结点。
为了简化链表的插入和删除操作,一般采用带表头结点的单链表来表示链式队列,所有初始化和判断条件需要作相应的更改。
链式队列的数据类型:
typedefstructqueueNode/*链式队列结点的类型定义*/
structqueueNode*next;
}QueueNode;
typedefstruct/*链式队列的类型定义*/
{QueueNode*front;
QueueNode*rear;
}LinkQueue;
链式队列基本操作:
各功能函数同顺序循环队列。
输入数据,建立链表,测试各功能函数。
实验七串的基本运算
掌握串的特点、连接、插入、删除、显示、查找、取子字符串、比较串的大小的操作,顺序定长存储的方式,以及模式匹配的基本思想及其想法。
串是一种特殊的线性表,串中所有数据元素都按某种次序排列在一个序列中。
串是由零个或多个字符构成的有限序列。
线性表由两种存储结构:
顺序存储和链式存储,串是一种特殊的线性表,因此也有两种基本存储结构:
顺序串和链式串。
采用顺序存储时,串是用一块地址连续的存储单元来存储串值。
串链式存储时,链表中每个结点可以存放一个字符,也可以存放多个字符。
串的模式匹配算法可以采用一种非常简单的思想去实现,即用模式串p中的meige字符与主串s中的字符一一比较,如果对应位置的字符相等,则进行两个串下一个位置字符的比较;
如果不相等,则匹配成功,返回该趟比较的起始位置即为匹配的位置;
否则匹配不成功。
2、数据结构设计
串的数据类型:
#include<
stdio.h>
#defineSTRINGMAX100
charvec[STRINGMAX]
intlen;
}str;
串的基本操作:
voidConcatStr(str*r1,str*r2)
voidSubStr(str*r,inti,intj)
voidDelStr(str*r,inti,intj)
str*InsStr(str*r,str*r1,inti)
intInDexStr(str*r,str*r1)
intLenStr(str*r)
str*CreateStr(ste*r)
intEqualStr(str*r1,str*r2)
5、编码实现(见源代码)
输入数据,建立一个字符串,测试各功能函数。
实验八稀疏矩阵和广义表子系统
掌握稀疏矩阵三元组表的存储、创建、显示、转置和查找等的方法。
掌握广义表的存储、新建、显示和查找等的方法。
掌握稀疏矩阵三元组表和广义表的算法分析方法。
一个阶数较大的矩阵中的非零元素个数s相当于矩阵元素的总个数t十分小时,称该矩阵为稀疏矩阵。
稀疏矩阵的压缩方法是只存储非零元素。
由于稀疏矩阵中非零元素的分布没有任何规律,所以在存储非零元素时还必须同时存储该非零元素所对应的行下标和列下标。
若把系数矩阵的三元组线性表按顺序存储结构存储,则称为系数矩阵的三元组顺序表。
广义表是线性表的推广。
在广义表中,要求各原子具有相同的类型,但允许各子表具有不同的结构。
广义表通常用链式存储结构进行存储,链表中的每个结点对应广义表中的一个元素。
对于原子元素,sublist和link都是指针域,前者是子表,后者指向下一个元素。
稀疏矩阵三元组表的数据类型:
iomanip.h>
stdlib.h>
string.h>
#defineSMAX100//三元组非零元素的最大个数
广义表的数据类型:
structlinknode//定义广义表
inttag;
//区分原子项或子表的标志位
linknode*link;
//存放下一个元素的地址
uniondata_sublist
chardata;
//存放原子值
linknode*sublist;
//存放子表的指针
}node;
稀疏矩阵三元组表的基本操作:
structSPNode//定义三元组
intI,j,v;
//三元组非零元素的行、列和值
};
structsparmatrix//定义稀疏矩阵
introws,cols,terms;
//稀疏矩阵行、列和非零元素的个数
SPNodedata[SMAX];
//三元组表
sparmatrixCreateSparmatrix()//创建稀疏矩阵
sparmatrixTrans(sparmatrixA//转置稀疏矩阵
voidShowSparmatrix(sparmatrixA)//显示稀疏矩阵
voidSearchSparmatrix(sparmatrixA,ints)//查找稀疏矩阵中非零元素
voidsparmatrix()//稀疏矩阵的三元组存储
广义表的基本操作:
voidDisastr(chars[],charhstr[])
linknode*CreatGL(chars[])//创建广义表
voidShowvl(linknode*gnode//显示广义表
intSearch(linknode*gnode,charx)//广义表中的元素
voidvastlist()//广义表
输入数据,分别建立稀疏矩阵三元组表和广义表,并测试各功能函
实验九二叉树实验
理解二叉树的逻辑结构和存储结构,熟练掌握二叉树的相关操作。
二叉树(BinaryTree)是n(n≥0)个结点的有限集合。
它或为空树(n=0),或为非空树;
对于非空树有:
(1)有一个特定的称之为根的结点;
(2)根结点以外的其余结点分别由两棵互不相交的称之为左子树和右子树的二叉树组成。
这个递归定义表明二叉树或为空,或是由一个根结点加上两棵分别称为左子树和右子树的互不相交的二叉树组成的。
由于左、右子树也是二叉树,则由二叉树的定义,它们也可以为空。
对二叉树所进行的操作有:
建立一棵二叉树;
访问(遍历)二叉树;
求二叉树的深度(高度)等相关操作。
二叉树一般采用链表存储结构,即用一个链表来存储一棵二叉树,二叉树中每个结点用链表中的一个链结点来存储。
常见的有二叉链表。
二叉链表的每个结点都有一个数据域和两个指针域,一个指针指向左孩子,另一个指针指向右孩子。
描述为:
typedefstructNode2
{ElemTypedata;
/*数据域*/
structNode2*lchild;
/*左指针域*/
structNode2*rchild;
/*右指针域*/
}BTNode;
二叉树的基本操作:
createbitree(BTNode*&
T)//构建一棵二叉树
DispLeaf(BTNode*b)//输出一棵给定二叉树的所有叶子结点。
InsertLeftNode(BTNode*p,charx)//左结点插入
InsertRightNode(BTNode*p,charx)//右结点插入
DeleteLeftTree(BTNode*p)//删除左子树
DeleteRightTree(BTNode*p)//删除右子树
SearchNode(BTNode*b,charx)//查找结点
LchildNode(BTNode*p)//查找左孩子结点
RchildNode(BTNode*p)//查找右孩子结点
BiTreeDepth(BTNode*b)//求二叉树的高度
DispBiTree(BTNode*b)//输出二叉树
PreOrder(BTNode*p)//按先序访问操作
InOrder(BTNode*p)//按中序访问操作
PostOrder(BTNode*p)//按后序访问操作
InTongji(BTNode*t,int&
m,int&
n)//中序遍历方法统计叶结点的个数
CountLeaf(BTNode*T)//返回指针T所指二叉树中所有叶子结点个数
Count(BTNode*T)//返回指针T所指二叉树中所有结点个数
输入二叉树中各结点的数据数据,测试各功能函数。
实验十图的存储与遍历
掌握图邻接矩阵的存储方法、图深度优先遍历的基本思想和图广度优先遍历的基本思想。
1.问题描述
图是由若干个顶点和若干条边构成的结构,每个顶点具有任意多个前驱和后继。
顶点是一些具体对象的抽象,而边是对象间关系的抽象。
图是一种结构复杂的数据结构,其信息包括两部分:
图中数据元素即顶点的信息,元素间的关系(顶点之间的关系)——边或者弧的信息。
图的常用存储结构:
邻接矩阵存储、邻接表存储、十字链表存储以及邻接多重表存储。
用一维数组存储图中顶点的信息,用二维数组存储图中边或弧的信息,该二维数组称为邻接矩