数据结构实验指导册.docx
《数据结构实验指导册.docx》由会员分享,可在线阅读,更多相关《数据结构实验指导册.docx(18页珍藏版)》请在冰豆网上搜索。
数据结构实验指导册
数据结构上机实验执导手册
目录
实验一顺序表的操作
实验二单链表的操作
实验三栈的链式存储结构的表示和实现
实验四二叉树遍历算法的设计
实验五采用邻接表实现图的DFS和BFS
附录部分程序源代码
实验一顺序表的操作
一.实验目的
1.了解顺序表的逻辑结构特性。
2.掌握线性表的顺序存储结构的定义及其C或C++语言实现。
3.掌握线性表顺序存储结构—顺序表的各种基本操作。
二.实验仪器设备
PC机一台
三.实验要求
1.认真阅读和掌握本实验的相关知识。
2.对给出的程序认真阅读,把相关缺失程序补充完整。
3.上机运行补充后的程序。
4.保存程序的运行结果,结合程序分析顺序结构的特点。
5.填写实验报告
四.实验内容及实验分析
1.实验内容
在VC++6.0的运行环境下,编写C或C++语言程序,利用顺序存储的方式来实现下列功能:
(1)根据键盘输入数据建立一个顺序表,并且输出该顺序表。
(2)根据屏幕菜单来选择数据的插入、删除以及查找操作。
(3)完成插入或删除数据操作后,把操作后的线性表进行输出。
(4)在完成插入、删除和查找操作后,选择菜单上的0,退出该程序的运行,结束实验内容。
2.实验分析
在顺序表的第i个位置上要求插入一个数据元素时候,先将顺序表的第i个位置元素后的所有数据元素按顺序后移一个位置,在插入的地方空出一个位置,然后把要插入的新数据元素插入到该位置,同时将表长加一。
在顺序表中删除表中第i个位置的数据元素的时候,先将该位置的数据元素删除,然后将第i个位置后的其他剩余元素按顺序依次向前移动一个位置,同时将表长减一。
顺序表中查找一个数据元素的值,需要遍历整个顺序表,如要找道该值,则返回该值在顺序表中的位置,否则继续查找。
如果遍历整个顺序表都没有找到该值,则要求函数返回-1
五.实验报告
1.总结顺序表的优缺点及顺序表在现实中可以解决的问题。
2.讨论如果按照由表尾到表头的顺序输入数据,则如何建立顺序表。
3.讨论自己在设计过程中遇到的问题、解决的过程以及收获体会。
实验二单链表的操作
一.实验目的
1.了解单链表的逻辑结构特性。
2.掌握单链表的链式存储结构的定义及其C或C++语言实现。
3.掌握单链表链式存储结构。
4.掌握单链表的各种基本操作。
二.实验仪器设备
PC机一台
三.实验要求
1.认真阅读和掌握本实验的相关知识。
2.对给出的程序认真阅读,把相关缺失程序补充完整。
3.上机运行补充后的程序。
4.保存程序的运行结果,结合程序分析链式结构的特点。
5.填写实验报告
四.实验内容及实验分析
1.实验内容
编写C语言程序,利用链式存储的方式来实现下列功能:
(1)根据键盘输入数据建立一个单链表,并且输出该单链表。
(2)根据屏幕菜单来选择数据的插入、删除以及查找操作。
(3)完成插入或删除数据操作后,把操作后的线性表进行输出。
(4)在完成插入、删除和查找操作后,选择菜单上的0,退出该程序的运行,结束实验内容。
2.实验分析
在单链表的第i个位置上要求插入一个数据元素时候,先生成一个存储单元S来存放插入数据元素X的值,其次修改第i个位置结点P的next域值,让其存入是结点S所在存储单元地址的值,再次修改结点S的next域的值,让S的next域的值为第i+1结点的地址值。
在单链表中删除表中第i个位置的数据元素的时候,先修改第i-1个数据元素的next域的地址值,使其值为第i+1个数据元素存储单元的地址值,最后释放第i个存储单元,使用函数free()。
在单链表中查找一个数据元素的值,需要遍历整个整个单链表,如要找道该值,则返回该值,否则继续查找。
如果遍历整个顺序表都没有找到该值,则要求函数返回-1
五实验报告
1.总结链表的优缺点及链表在现实中可以解决的问题。
2.讨论自己在设计过程中遇到的问题、解决的过程以及收获体会。
实验三栈的链式存储结构的表示和实现
一实验目的
1.了解栈的逻辑结构特性。
2.掌握栈的链式存储结构的定义。
3.掌握栈的链式结构的表示和实现。
二实验仪器设备
PC机一台
三实验要求
1.认真阅读和掌握本实验的相关知识。
2.编写程序实现栈的链式存储方式。
3.编写程序实现对栈空的判断以及栈的入栈和出栈操作、取栈顶元素。
4.保存程序的运行结果,结合程序分析链式结构的特点。
5.填写实验报告
四实验内容及实验分析
1.实验内容
编写C或C++语言程序,利用链式存储的方式来实现下列功能:
(1)初始化链栈。
(2)将链栈置空。
(3)完成入栈和出栈操作,完成取栈顶元素操作。
(4)选择菜单上的0,退出该程序的运行,结束实验内容。
2.实验分析
(1)初始化栈操作,将栈的栈顶指针置为空值,即设栈S和栈顶指针top,S→top=null。
(2)如果所建栈里有数据元素,要将其置空,同样也是将栈顶指针的值置为空值。
(3)入栈操作,向栈里插入数据元素。
首先要为插入数据元素分配结点,将插入数据元素的值赋值给插入结点的数据域,其次修改栈顶指针的指向关系,即修改插入结点和栈顶指针的地址,最后修改栈顶指针。
(4)出栈操作,从栈里删除数据元素。
首先要判断栈是否为空栈,如是空栈则操作失败。
否则,进行出栈操作,修改删除结点和栈顶指针,最后释放删除结点。
(5)取栈顶元素。
五实验报告
1.总结栈的优缺点及栈在现实中可以解决的问题。
2.讨论自己在设计过程中遇到的问题、解决的过程以及收获体会。
实验四二叉树遍历算法的设计
一实验目的
1.掌握二叉树的结构特征,以及各种存储结构的特点。
2.掌握二叉树在实践中的应用范围。
3.掌握用指针类型来描述、访问和遍历二叉树的操作算法。
二实验仪器设备
PC机一台
三实验要求
1.认真阅读和掌握本实验的相关知识。
2.编写程序实现二叉树的链式存储方式。
3.编写程序实现对二叉树的先序遍历、中序遍历和后序遍历的算法实现。
4.保存程序的运行结果,结合程序分析二叉树的结构特点。
5.填写实验报告
四实验内容及实验分析
1.实验内容
编写C或C++语言程序,利用链式存储的方式来实现下列功能:
(1)采用二叉树性质5来建立二叉树。
(2)完成二叉树的三种遍历算法。
(3)选择菜单上的0,退出该程序的运行,结束实验内容。
2.实验分析
(1)定义二叉树结点值的数据类型,将其定义为字符型数据,定义二叉树中结点的结构类型。
(2)利用性质5建立二叉树,设置序号为1的结点为二叉树的根结点,序号为偶数的结点为该二叉树的左孩子,序号为奇数的结点为该二叉树的右孩子。
(3)采用递归方式来遍历二叉树,也就是实现二叉树的遍历是利用递归的方法来实现,即先序递归遍历、中序递归遍历、后序递归遍历。
先序递归遍历算法描述:
1访问二叉树的根结点。
2先序遍历左子树。
3先序遍历右子树。
中序递归遍历算法描述:
1中序遍历左子树。
2访问根结点。
3中序遍历右子树。
后序递归遍历算法描述:
1后序遍历左子树。
2后序遍历右子树。
3访问根结点。
五实验报告
1.总结二叉树的优缺点及二叉树在现实中可以解决的问题。
2.讨论自己在设计过程中遇到的问题、解决的过程以及收获体会。
实验五采用邻接表实现图的DFS和BFS
一实验目的
1.掌握图的基本存储方法。
2.熟练掌握图的两种搜索路径的遍历方法。
3.掌握图的有关应用。
二实验仪器设备
PC机一台
三实验要求
1.认真阅读和掌握本实验的相关知识。
2.编写程序实现图的邻接表存储方式。
3.编写程序实现对图的DFS(递归)和BFS(非递归)的算法实现。
4.保存程序的运行结果,结合程序分析这两种遍历的结构特点。
5.填写实验报告
四实验内容及实验分析
1.实验内容
编写C或C++语言程序,实现图的下列功能:
(1)利用邻接表的结构特性实现对图中各个顶点的存储。
(2)利用DFS算法对图中各个顶点进行遍历并且输出遍历结果。
(3)利用BFS算法对图中各个顶点进行遍历并且输出遍历结果。
(4)选择菜单上的0,退出该程序的运行,结束实验内容。
2.实验分析
(1)建立无向图的邻接表,并且输出该无向图的邻接表。
(2)输入DFS的出发点,按照DFS遍历算法遍历图中顶点。
(3)输入BFS的出发点,由于BFS采用的是非递归形式,所以要通过建立队列来实现BFS的遍历过程。
因此,在编写该算法的过程中,就要建立队列,即队列的初始化操作、判断队是否为空、入队和出队操作。
五实验报告
1.总结BFS和DFS的优缺点。
2.总结图的邻接表存储特点。
2.讨论自己在设计过程中遇到的问题、解决的过程以及收获体会。
附录
顺序表程序部分代码:
#include
#include
#defineMAXSIZE20数组最大界限
typedefintElemType;数据元素类型
typedefstruct
{
ElemTypea[MAXSIZE];一维数组子域
intlength;表长度域
}SqList;顺序存储的结构体类型
SqLista,b,c;
voidcreat_list(SqList*L);
voidout_list(SqListL);
voidinsert_sq(SqList*L,inti,ElemTypee);
ElemTypedelete_sq(SqList*L,inti);
intlocat_sq(SqListL,ElemTypee);
主函数
voidmain()
{
inti,k,loc;
ElemTypee,x;
charch;
do
{
printf("\n\n\n");
printf("\n1.建立线性表");
printf("\n2.插入数据元素");
printf("\n3.删除数据元素");
printf("\n4.查找数据元素");
printf("\n0.结束程序运行");
printf("\n==========================================");
printf("\n请输入你的选择(1,2,3,4,0)");
scanf("%d",&k);
switch(k)
{
case1:
{
creat_list(&a);
out_list(a);
}break;
case2:
{
printf("\n请输入插入位置:
");
scanf("%d",&i);
printf("\n请输入要插入的数据元素值:
");
scanf("%d",&e);
insert_sq(&a,i,e);
out_list(a);
}break;
case3:
{
printf("\n请输入删除位置:
");
scanf("%d",&i);
x=delete_sq(&a,i);
out_list(a);
if(x!
=-1)
printf("\n删除数据元素为:
%d\n",x);
else
printf("要删除的数据元素不存在!
");
}break;
case4:
{
printf("\n请输入要查找的数据元素值:
");
scanf("%d",&e);
loc=locat_sq(a,e);
if(loc==-1)
printf("\n未找到指定数据元素!
");
else
printf("\n已找到,数据元素位置是%d",loc);
}break;
}
}while(k!
=0);
printf("\n按回车键,返回...\n");
ch=getchar();
}
建立线性表
voidcreat_list(SqList*L)
{
inti;
printf("请输入线性表的长度:
");
scanf("%d",&L->length);
for(i=0;ilength;i++)
{
printf("数据元素%d=",i);
scanf("%d",&(L->a[i]));
}
}
输出线性表
voidout_list(SqListL)
{
inti;
for(i=0;i<=L.length-1;i++)
{
printf("%10d",L.a[i]);
}
}
在线性表的第i个位置插入数据元素e
voidinsert_sq(SqList*L,inti,ElemTypee)
{
}
删除第i个数据元素,返回其值
ElemTypedelete_sq(SqList*L,inti)
{
}
查找值为e的元素,返回它的值
intlocat_sq(SqListL,ElemTypee)
{
inti=0;
while(i<=L.length-1&&L.a[i]!
=e)
i++;
if(i<=L.length-1)
return(i+1);
else
return(-1);
}
单链表操作的部分源代码:
#include
#include
#include
typedefintElemType;数据元素类型
typedefstructLNode
{
ElemTypedata;数据子域
structLNode*next;指针子域
}LNode;顺序存储的结构体类型
LNode*L;
LNode*creat_L();
voidout_L(LNode*L);
voidinsert_L(LNode*L,inti,ElemTypee);
ElemTypedelete_L(LNode*L,inti);
intlocat_L(LNode*L,ElemTypee);
主函数
voidmain()
{
inti,k,loc;
ElemTypee,x;
charch;
do
{
printf("\n");
printf("\n1.建立单链表");
printf("\n2.插入数据元素");
printf("\n3.删除数据元素");
printf("\n4.查找数据元素");
printf("\n0.结束程序运行");
printf("\n==========================================");
printf("\n请输入你的选择(1,2,3,4,0)");
scanf("%d",&k);
switch(k)
{
case1:
{
L=creat_L();
out_L(L);
}break;
case2:
{
printf("\n请输入插入位置:
");
scanf("%d",&i);
printf("\n请输入要插入的数据元素值:
");
scanf("%d",&e);
insert_L(L,i,e);
out_L(L);
}break;
case3:
{
printf("\n请输入删除位置:
");
scanf("%d",&i);
x=delete_L(L,i);
out_L(L);
if(x!
=-1)
{
printf("\n删除数据元素为:
%d\n",x);
printf("删除%d后的单链表为:
\n",x);
out_L(L);
}
else
printf("要删除的数据元素不存在!
");
}break;
case4:
{
printf("\n请输入要查找的数据元素值:
");
scanf("%d",&e);
loc=locat_L(L,e);
if(loc==-1)
printf("\n未找到指定数据元素!
");
else
printf("\n已找到,数据元素位置是%d",loc);
}break;
}
printf("\n-----------------------------------");
}while(k>=1&&k<5);
printf("\n按回车键,返回...\n");
ch=getchar();
}
建立线性链表
LNode*creat_L()
{
LNode*h,*p,*s;
ElemTypex;
h=(LNode*)malloc(sizeof(LNode));
h->next=NULL;
p=h;
printf("请输入第一个数据元素:
");
scanf("%d",&x);
while(x!
=-999)
{
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
s->next=NULL;
p->next=s;
p=s;
printf("请输入下一个数据元素:
(输入-999表示结束。
)");
scanf("%d",&x);
}
return(h);
}
输出单链表中的数据元素
voidout_L(LNode*L)
{
LNode*p;
p=L->next;
printf("\n\n");
while(p!
=NULL)
{
printf("%5d",p->data);
p=p->next;
}
}
在单链表中的第i个位置插入数据元素e
voidinsert_L(LNode*L,inti,ElemTypee)
{
}
删除第i个数据元素,返回其值
ElemTypedelete_sq(SqList*L,inti)
{
}
查找值为e的元素,返回它的值
intlocat_L(LNode*L,ElemTypee)
{
LNode*p;
intj=1;
p=L->next;
while(p!
=NULL&&p->data!
=e)
{
p=p->next;
j++;
}
if(p!
=NULL)
return(j);
else
return(-1);
}