数据结构实验指导书.docx
《数据结构实验指导书.docx》由会员分享,可在线阅读,更多相关《数据结构实验指导书.docx(11页珍藏版)》请在冰豆网上搜索。
数据结构实验指导书
目录
实验一线性表1
实验二数组的基本操作3
实验三队列的基本操作5
实验四栈的基本操作7
实验五二叉树操作树10
实验六图的基本操作11
《数据结构实验指导书》
实验一线性表
一、实验目的:
1、掌握使用TurboC2.0上机调试线性表的基本方法;
2、掌握线性表的基本操作:
插入、删除、查找以及线性表合并等运算在顺序存储结构和链接存储结构上。
二、实验环境:
PC机、TurboC或VisualC++
三、实验描述:
一元多项式的相加
四、实验要求:
(1)建立两个一元多项式A、B,按指数降序排列。
(2)实现A+B,输出其运算结果。
五、实验步骤:
(1)用带头结点的单链表存储多项式A、B,多项式的类型定义如下:
typedefstruct{//项的表示,多项式的项作为LinkList的数据元素
floatcoef;//系数
intexpn;//指数
}term,ElemType;
typedefstructLnode{
ElemTypedata;
StructLnode*next;
}*LinkList;
typedefLinkListpolynomial;//用带头结点的有序(按指数递增)单链表表示多项式
(2)基本操作:
intcmp(terma,termb)
//比较a于b的指数,分别返回-1,0,1
voidCreatPolyn(polynomial&p,intm)
//输入m项的系数和指数,建立表示一元多项式的有序单链表p
voidPrintPolyn(polynomalp)
//输出多项式的各项
voidAddPolyn(polynomial&pa,polynomial&pb)
//多项式相加:
pa=pa+pb,利用两个多项式的结点构成“和多项式”
(3)程序流程
polynomalA,B;//定义多项式A,B
intm,n;//定义多项式A,B的项数
CreatPolyn(A,m);//创建有m项的多项式A,
PrintPolyn(A);//输出多项式A;
CreatPolyn(B,n);//创建有n项的多项式B
PrintPolyn(B);//输出多项式B
AddPolyn(A,B);//两个多项式相加A=A+B
PrintPolyn(A);//输出相加的结果A
(4)测试数据:
1)(2x+5x8-3.1x11)+(7-5x8+11x9)=(7+2x+11x9-3.1x11)
2)(1+x+x2+x3+x4+x5)+(-x3-x4)=(1+x+x2+x5)
3)(x+x3)+(-x-x3)=0
4)(x+x2+x3)+0=(x+x2+x3)
实验二数组的基本操作
一、实验目的:
掌握各种内部排序算法及各种内部排序的效率。
二、实验环境:
PC机、TurboC或VisualC++
三、实验描述:
通过随机数据比较各种内部排序算法。
四、实验要求:
(1)随机产生5组100个数据。
(2)对冒泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、堆排序的关键字比较和交换次数进行统计。
五、实验步骤:
(1)用顺序存储结构存储数据
(2)产生100个随机数
(3)用上述内部排序算法(算法见)对
(2)的随机数进行排序,并统计比较次数和交换次数。
参考算法:
#defineM5
#defineN4
#include"stdio.h"
main()
{inti,j;
staticfloatscore[M+1][N+1]={{78,85,83,65},{88,91,89,93},{72,65,54,75},{86,88,75,60},{69,60,50,72}};
for(i=0;i{for(j=0;j{score[i][N]+=score[i][j];
score[M][j]+=score[i][j];
}
score[i][N]/=N;
}
for(j=0;jscore[M][j]/=M;
clrscr();
printf("学生编号课程1课程2课程3课程4个人平均\n");
for(i=0;i{printf("学生%d\t",i+1);
for(j=0;jprintf("%6.1f\t",score[i][j]);
printf("\n");
}
for(j=0;j<8*(N+2);j++)
printf("-");
printf("\n课程平均");
for(j=0;jprintf("%6.1f\t",score[M][j]);
printf("\n");
getch();
}
(4)重复
(2)(3)共5次。
(5)给出结论。
实验三队列的基本操作
一、实验目的:
掌握队列的基本操作:
初始化队列、判队列为空、出队列、入队列等运算。
二、实验环境:
PC机、TurboC或VisualC++
三、实验描述:
通过队列的操作掌握队列的各种性质。
四、实验要求:
(1)随机产生5组100个数据,加入队列。
(2)初始化队列、判队列为空、出队列、入队列等运算
五、实验步骤:
(1)产生杨辉三角数据
(2)利用队列的基本操作实现杨辉三角的输出
算法如下:
voidout_number(intn);
{
init_queue(Q);
printf
(1);
en_queue(Q,s1+s2);
for(I=2;I<=n;I++)
{s1=0;for(j=1;j<=I-1;j++)
{s2=out_queue(Q);
printf(s2);
en_queue(q,s1+s2);
s1=s2;
}
printf
(1);
en_queue(Q,1+s2);
}
参考程序如下
typedefstruct
{int*data;
intfront;
intrear;
}
sqqueue;
main()
{
inti,j,m,s1=0,s2=1;
sqqueueq;
clrscr();
q.data=(int*)malloc(100*sizeof(int));
q.rear=q.front=0;
q.data[q.rear]=s2;
q.rear++;
printf("%40d",s2);
for(i=2;i<=8;i++)
{s1=0;
for(m=1;m<=40-i;m++)
printf("%c",'');
for(j=1;j<=i-1;j++)
{s2=q.data[q.front];
q.front++;
printf("%d",s2);
q.data[q.rear]=s1+s2;
q.rear++;
s1=s2;
}
printf("%d\n",1);
q.data[q.rear]=1+s2;
q.rear++;
}
}
(3)查看结果,得出结论。
实验四栈的基本操作
一、实验目的:
掌握栈的基本操作:
初始化栈、判栈为空、出栈、入栈等运算。
二、实验环境:
PC机、TurboC或VisualC++
三、实验描述:
通过队列的操作掌握栈的各种性质。
四、实验要求:
1.认真阅读和掌握本实验的算法。
2.上机将本算法实现。
3.保存和打印出程序的运行结果,并结合程序进行分析。
五、实验步骤:
1、定义栈的顺序存取结构
2、分别定义栈的基本操作(初始化栈、判栈为空、出栈、入栈等)
3、定义一个函数用来实现上面问题:
1)十进制整数X和R作为形参
2)初始化栈
3)只要X不为0重复做下列动作
4)将X%R入栈
5)X=X/R
6)只要栈不为空重复做下列动作
7)栈顶出栈
8)输出栈顶元素
参考程序:
#defineMAXSIZE100
#include
structstack{
intdata[MAXSIZE];
inttop;
};
voidinit(structstack*s){
s->top=-1;
}
intempty(structstack*s){
if(s->top==-1)
return1;
else
return0;
}
voidpush(structstack*s,inti){
if(s->top==MAXSIZE-1){
printf("Stackisfull\n");
return;
}
s->top++;
s->data[s->top]=i;
}
intpop(structstack*s){
if(empty(s)){
printf("stackisempty");
return-1;
}
return(s->data[s->top--]);
}
voidtrans(intnum){
structstacks;
intk;
init(&s);
while(num){
k=num%16;
push(&s,k);
num=num/16;
}
while(!
empty(&s)){
k=pop(&s);
if(k<10)
printf("%d",k);
else
printf("%c",k+55);
}
printf("\n");
}
main(){
intnum;
clrscr();
printf("Inputanum,-1toquit:
\n");
scanf("%d",&num);
while(num!
=-1){
trans(num);
scanf("%d",&num);
}
}
实验五二叉树操作树
一、实验目的:
掌握二叉树的存储结构及先序、中序和后序三种基本遍历、层次遍历操作。
二、实验环境:
PC机、TurboC或VisualC++
三、实验描述:
二叉树的建立与遍历
四、实验要求:
1.采用递归方式建立二叉树
2.采用非递归方式建立二叉树
3.采用先序、中序和后序三种方式遍历该二叉树
4.按层次遍历该二叉树
五、实验步骤:
1.定义二叉树的结点类型及二叉树类型
2.递归方式建立二叉树(算法参见课本)
3.三种方式遍历二叉树(算法参见课本)
4.层次遍历该二叉树
5.非递归方式(按层次)建立二叉树
提示:
1.以三元组(F,C,L/R)形式表示输入一棵二叉树的诸边(F:
表示双亲结点的标识,C表示孩子结点标识,L/R表示作为F的左右孩子的标识)。
2.创建一个队列BQ,用于将输入的二叉树每个结点的起始地址及结点的值保存起来
3.按层次输入二叉树的每一个结点(以三元组形式),创建每一个新结点P,同时把该结点的起始地址及值入队BQ
4.每输入一个三元组,查找BQ中与F相同的值(查找父结点的起始地址),根据L/R的信息,将该结点作为F的左或右孩子(F->Lchild=P或F->Rchild=P)
实验六图的基本操作
一、实验目的: