数据结构课程上机实验教学Word格式文档下载.docx
《数据结构课程上机实验教学Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数据结构课程上机实验教学Word格式文档下载.docx(29页珍藏版)》请在冰豆网上搜索。
1.熟悉C++语言的上机环境,掌握C++语言的基本结构。
2.会定义线性表的顺序存储结构。
(链式存储结构)
3.熟悉对顺序表(单链表)的一些基本操作。
二、实验要求
1.认真阅读和掌握本实验内容所给的全部程序。
2.保存和打印出程序运行结果,并结合程序进行分析。
注意事项:
在做第一次“数据结构”课程实验之前,要在硬盘上建立好自己的工作目录,专门来存储你所做的实验程序及相关信息,以后每次做实验都采用这个目录。
三、实验内容
1、示例(以顺序表为示例,同学们也可以编程实现单链表的创建、查找、插入、删除、求最大最小值等功能)
以输入整形数据为主,输入后按“?
”结束输入。
程序所能表达到的功能为:
实现顺序表的创建、查找、插入、删除等功能。
程序运行后,输入数据并执行。
源程序:
#include"
stdio.h"
conio.h"
#defineMaxSize50
typedefcharelemtype;
typedefstructnode
{
elemtypedata[MaxSize];
intlen;
}lnode,*List;
voidinit(ListL){L->
len=0;
}
intlength(ListL)
{returnL->
len;
elemtypegetnode(ListL,intpos)
if(pos<
1||pos>
L->
len)printf("
error"
);
elsereturnL->
data[pos-1];
intlocate(ListL,elemtypex)
{
inti=0;
while(i<
len&
&
L->
data[i]!
=x)i++;
if(i==L->
len)return-1;
elsereturn(i+1);
voidinsert(ListL,intpos,elemtypex)
intj;
len+1)printf("
inserterror\n"
else{
len++;
for(j=L->
j>
=pos;
j--)
data[j]=L->
data[j-1];
data[pos-1]=x;
};
voiddelnode(ListL,intpos)
{intj;
1||pos>
len)printf("
delerror\n"
for(j=pos;
j<
j++)
data[j-1]=L->
data[j];
len--;
}
voidprint(ListL)
inti;
for(i=1;
i<
i++)
printf("
%c->
"
L->
data[i-1]);
%c"
data[L->
len-1]);
voidmain()
inti=1,n;
lnodeL;
charch,x;
init(&
L);
\n\n\n*******************************顺序表演示程序***********\n"
请输入你想建立的顺序表的元素,以?
结束:
ch=getchar();
while(ch!
='
?
'
)
{insert(&
L,i,ch);
i++;
};
你建立的顺序表为:
print(&
\n顺序表的长度为:
%d"
L.len);
\n输入你想查找的元素:
fflush(stdin);
scanf("
&
x);
你查找的元素为%c序位为%d"
x,locate(&
L,x));
\n输入你想查找的元素序位:
n);
\n你查找的元素为:
getnode(&
L,n));
\n输入你想插入的元素以及序位:
<
用逗号隔开>
%c,%d"
x,&
insert(&
L,n,x);
\n插入后顺序表为:
\n请输入你想删除的元素序位:
delnode(&
L,n);
\n删除后的顺序表为:
getch();
四、测试结果
运行程序,屏幕显示:
“请输入你想建立的顺序表的元素,以?
”
输入:
54381
5—>
4—>
3—>
8—>
1
顺序表的长度为:
5
输入你想查找的元素:
4
你查找的元素为4序位为2
输入你想查找的元素序位:
你查找的元素为:
8
输入你想插入的元素以及序位:
:
6,3
插入后顺序表为:
6—>
请输入你想删除的元素序位:
删除后的顺序表为:
实验二二叉树的操作
一.实验目的
理解并熟悉掌握创建二叉树和实现二叉树的三种遍历
二.实验内容
创建二叉树和实现二叉树的三种遍历
根据提示输入字符型数据创建二叉树,输入值为所有字符型数据
输出为遍历后的每个结点的值的顺序
创建二叉树并能实现二叉树的先序、中序、后序遍历
如果输入数据为:
abc
输出结果为:
bac
bca
程序流程:
main()clrscr()createtree()preorder()inorder()postorder
stdlib.h"
/*引入头文件*/
structtnode/*定义二叉树存储结构*/
{chardata;
structtnode*lchild;
structtnode*rchild;
structtnodetree;
/*定义二叉树指针*/
voidcreatetree(structtnode*t)/*创建函数*/
{structtnode*p=t;
/*把二叉树指针给p*/
charcheck;
if(p->
lchild==NULL||p->
rchild==NULL)/*判断左右子树是否为空*/
{printf("
pleaseenterthedata:
/*输入根结点数据*/
scanf("
(p->
data));
getchar();
}
lchild==NULL)
%cleftchildisnull.Add?
y/n\n"
p->
data);
/*左子树空,询问是否创建*/
check);
if(check=='
y'
{structtnode*q=(structtnode*)malloc(sizeof(structtnode));
/*开辟空间*/
q->
lchild=NULL;
rchild=NULL;
p->
lchild=q;
createtree(q);
rchild==NULL)
%crightchildisNULL.Add?
/*右子树空,询问是否创建*/
rchild=q;
/*连到二叉树上*/
voidpreorder(structtnode*t)/*先序遍历函数*/
{if(t)
%c"
t->
/*输出根结点数据*/
preorder(t->
lchild);
rchild);
voidinorder(structtnode*t)/*中序遍历函数*/
{inorder(t->
printf("
inorder(t->
voidpostorder(structtnode*t)/*后序遍历函数*/
{
postorder(t->
clrscr();
/*清屏函数*/
tree.lchild=NULL;
/*左子树*/
tree.rchild=NULL;
/*右子树*/
createtree(&
tree);
/*创建二叉树*/
preorder(&
/*先序遍历*/
\n"
inorder(&
/*中序遍历*/
postorder(&
/*后序遍历*/
三.使用说明
程序运行:
先输入根结点数据,例如:
a
输入y或n判断是否创建左子树。
输入y然后输入左子树数据
输入y或n判断是否创建右子树。
输入y然后输入右子树数据
按回车可查看遍历结果并退出程序。
四.测试结果
运行程序,屏幕提示:
a/*首先输入根结点,为a*/
aleftchildisnull.add?
y/n/*询问是否输入a结点的左结点*/
y/*输入*/
b/*输入结点a的左结点,为b*/
bleftchildisnull.add?
y/n/*询问是否输入b结点的左结点*/
n/*不输入*/
brightchildisnull.add?
y/n/*询问是否输入b结点的右结点*/
arightchildisnull.add?
y/n/*询问是否输入a结点的右结点*/
c/*输入结点a的右结点,为c*/
cleftchildisnull.add?
y/n/*询问是否输入c结点的左结点*/
crightchildisnull.add?
y/n/*询问是否输入c结点的右结点*/
程序退出,显示结果应为:
abc/*先序*/
bac/*中序*/
bca/*后序*/
实验三图的遍历操作
一.实验目的:
该实验主要完成对图的创建,并实现图的深度优先遍历和广度优先遍历
二.实验内容:
所输入的数据要为整形数据
输出的形式为:
每按一次回车,遍历一个结点
能创建最大结点树为30的任意图,实现对无向图的两种遍历
main()clrscr()visited()DFS()visited()BFS()
#include<
stdlib.h>
/*引用两个头文件*/
#definemaxvex30/*定义MAXVEX=30*/
structedgenode/*定义边的结构体*/
{intadjvex;
charinfo;
structedgenode*next;
structvexnode/*定义点的结构体*/
structedgenode*link;
typedefstructvexnodeadjlist[maxvex];
/*自定义adjlist为结构体数组类型*/
adjlisttu1;
/*定义结构体数组变量tu1*/
voidcreategraph(adjlistg,intn)/*图创建函数*/
{inte,i,s,d;
/*定义存储边、点的变量*/
structedgenode*p,*q;
/*定义边的结构体指针*/
thepoint(n)andedge(e):
/*显示提示输入点,边*/
%d,%d"
n,&
e);
/*接收点、边存入n,e中*/
for(i=1;
=n;
{getchar();
\tthe%dinformation:
i);
/*提示输入结点信息*/
g[i].data);
/*存储信息*/
g[i].link=NULL;
/*最后指针为空*/
=e;
\nthe%dedges=>
\n\t:
/*提示输入边信息*/
s,&
d);
/*接收边的信息*/
p=(structedgenode*)malloc(sizeof(structedgenode));
q=(structedgenode*)malloc(sizeof(structedgenode));
/*开辟两个存储边的空间*/
adjvex=d;
/*把其中一个点存储下来*/
info=g[d].data;
adjvex=s;
/*把另一个点存储下来*/
info=g[s].data;
next=g[s].link;
/*p和s的link指针连接起来*/
g[s].link=p;
next=g[d].link;
/*q和s的link指针连接起来*/
g[d].link=q;
/*完成一个边的创建*/
intvisited[maxvex];
/*定义访问数组*/
voiddfs(adjlistadj,intv)/*深度优先遍历函数*/
{inti;
structedgenode*p;
/*定义边指针*/
visited[v]=1;
/*把开始遍历的点在访问数组中标识*/
nowisatpoint%d"
v);
/*输出正访问的点*/
p=adj[v].link;
thedatais%c\n"
adj[v].data);
/*输出点的信息*/
getch();
while(p)
{if(visited[p->
adjvex]==0)
dfs(adj,p->
adjvex);
/*没有访问的再调用DFS函数*/
p=p->
next;
/*访问过的判断下一个*/
intquene[maxvex];
voidbfs(adjlistadj,intvi)/*广度优先遍历函数*/
{intm=maxvex;
/*定义一个队列*/
intfront=0,rear=1,v;
visited[vi]=1;
/*开始访问的点标识一下*/
nowvisitthepoint:
%d\n"
vi);
/*输出正访问的点*/
quene[rear]=vi;
/*把访问过的点放入数组中*/
while(front!
=rear)
{front=(front+1)%m;
v=quene[front];
adjvex]==0)/*判断p->
adjvex点是否访问过*/
{visited[p->
adjvex]=1;
/*访问没有访问过的结点*/
/*输出正访问的结点*/
rear=(rear+1)%m;
quene[rear]=p->
adjvex;
/*放入数组中*/
/*指向下一个*/
clrscr();
creategraph(tu1,0);
/*创建图*/
maxvex;
visited[i]=0;
/*访问数组初始化*/
dfs(tu1,1);
/*调用DFS*/
/*等待输入*/
bfs(tu1,1);
/*调用BFS*/
三.使用说明:
根据屏幕上的英文提示先输入结点的个数和边数。
然后输入各结点存储的信息,再输入定义的边,形成图。
最后分别按照DFS深度优先遍历和BFS广度优先遍历实现对图的遍历。
四.测试结果:
运行程序,屏幕提示:
4,3/*输入顶点和边的数目*/
the1information:
a/*各个顶点的信息*/
the2information:
b
the3information:
c
the4information:
d
the1edges=>
/*各个边的连接情况*/
:
1,2
the2edges=>
1,3
the3edges=>
3,4
nowisatpoint1thedataisa/*深度优先遍历结果*/
nowisatpoint3thedataisc
nowisatpoint4thedataisd
nowisatpoint2thedataisb
1/*广度优先遍历结果*/
3
2
实验四栈的基本操作
一、实验目的:
1.熟练掌握栈的结构,以及这种数据结构的特点;
2.能够在两种存储结构上实现栈的基本运算,特别注意栈满和栈空的判断条件及描述方法;
二、实验内容:
计算表达式的值
【问题描述】
计算用运算符后缀法表示的表达式的值。
后缀表达式也称逆波兰表达式,比中缀表达式计算起来更方便简单些,中缀表达式要计算就存在着括号的匹配问题,所以在计算表达式值时一般都是先转换成后缀表达式,再用后缀法计算表达式的值。
如:
表达式(a+b*c)/d-e用后缀法表示应为abc*+d/e-。
只考虑四则算术运算,且假设输入的操作数均为1位十进制数(0—9),并且输入的后缀形式表达式不含语法错误。
【数据描述】
#defineadd43/*运算符加号‘+’的ASCII码*/
#definesubs