数据结构指导书第三版.docx
《数据结构指导书第三版.docx》由会员分享,可在线阅读,更多相关《数据结构指导书第三版.docx(41页珍藏版)》请在冰豆网上搜索。
数据结构指导书第三版
实验一
实验名称
线性表的顺序存储
实验日期
实验目的
1.掌握线性表的顺序存储结构。
2.能熟练利用顺序存储结构实现线性表的基本操作。
3.能熟练掌握线性表创建、插入、删除、查找和显示线性表中元素等基本操作。
实验内容
1.建立含有不少于3个元素的顺序表,并将结果在屏幕上输出。
2.对刚建立的顺序表实现插入、删除、查找,并将结果在屏幕上输出。
3.设计一个选择式菜单。
算法描述:
#include"stdio.h"
#include"malloc.h"
#defineMAXSIZE200//线性表允许的最大长度
#definedatatypeint
typedefstruct//定义线性表的结构
{datatypedata[MAXSIZE];//表示线性表(a1,a2,….,an)
intlast;//last表示线性表的实际长度
}SeqList;
/*线性表初始化:
Init_List(L)
初始条件:
表L不存在
操作结果:
构造一个空的线性表*/
SeqList*init_SeqList()
{SeqList*L;
L=newSeqList;//L=malloc(sizeof(SeqList));
L->last=-1;
returnL;
}
/*插入操作:
Insert_List(L,i,x)
初始条件:
线性表L存在,插入位置正确(1<=i<=n+1,n为插入前的表长)。
操作结果:
在线性表L的第i个位置上插入一个值为x的新元素,这样使原序号为i,i+1,...,n的数据元素的序号变为i+1,i+2,...,n+1,插入后表长=原表长+1。
*/
intInsert_SeqList(SeqList*L,inti,datatypex)
{
}
/*删除操作:
Delete_List(L,i)
初始条件:
线性表L存在,1<=i<=n。
操作结果:
在线性表L中删除序号为i的数据元素,删除后使序号为i+1,i+2,...,n的元素变为序号为i,i+1,...,n-1,删除后新表长=原表长-1。
*/
intDelete_SeqList(SeqList*L,inti)
{
}
/*按值查找:
Locate_List(L,x),x是给定的一个数据元素。
初始条件:
线性表L存在
操作结果:
在表L中查找值为x的数据元素,其结果返回在L中首次出现的值为x的那个元素的序号或地址,称为查找成功;否则,在L中未找到值为x的数据元素,返回一特殊值表示查找失败。
*/
intLocation_SeqList(SeqList*L,datatypex)
{
}
voidprint(SeqList*L)//打印线性表
{inti;
for(i=0;i<=L->last;i++)
printf("%d,",L->data[i]);
printf("\n");
}
voidmain()
{SeqList*L;
inti,j,k;
datatypex;
do
{printf("\n\n\n\n");
printf("\t\t\t线性表子系统\n");
printf("\t\t*******************************\n");
printf("\t\t*1----初始化表 *\n");
printf("\t\t*2----插入 *\n");
printf("\t\t*3----删 除 *\n");
printf("\t\t*4----查 找 *\n");
printf("\t\t*5----显 示 *\n");
printf("\t\t*0----返 回 *\n");
printf("\t\t*******************************\n");
printf("\t\t请选择菜单项(0-5):
");
scanf("%d",&k);getchar();
switch(k)
{
case1:
L=init_SeqList();//初始化线性表
break;
case2:
//在线性表第i位置处插入值为X的元素
printf("\n请输入插入的位置i和数据X(输入格式:
i,X):
");
scanf("%d,%d",&i,&x);
j=Insert_SeqList(L,i,x);
break;
case3:
//删除线性表中值为X的元素
printf("\n请输入要删除元素的位置i:
");
scanf("%d",&i);
j=Delete_SeqList(L,i);
if(j==1)printf("删除成功!
!
");
elseprintf("删除失败!
!
");
break;
case4:
//查找线性表中元素值为x的位置
printf("\n请输入要查找的数值X:
");
scanf("%d",&x);
j=Location_SeqList(L,x);
if(j!
=-1)
{print(L);printf("中值为X所在的位置是%d",j);}
else
printf("线性表中无此元素!
!
\n");
break;
case5:
//输出线性表
printf("\n线性表的顺序存储为:
");
print(L);
}
}while(k!
=0);
}
运
行
结
果
实验人员
实验地点
教师
评语
优
良
中
及格
不及格
批改日期
实验二
实验名称
线性表的链式存储
实验日期
实验目的
1.掌握线性表的链式存储结构。
2.能熟练利用链式存储结构实现线性表的基本操作。
3.能熟练掌握链式存储结构中算法的实现。
实验内容
1.用头插法或尾插法建立带头结点的单链表,并在屏幕上输出显示此链表。
2.实现单链表上的插入、删除、修改、查找、计数等操作,并将结果在屏幕上输出。
3.设计一个选择式菜单。
算法描述:
#include"stdio.h"
#include"malloc.h"
#definedatatypeint
typedefstructnode
{datatypedata;//链表的数据域
structnode*next;//链表的指针域
}LNode,*LinkList;
LinkListCreat_LinkList1()//头插入法建立单链表算法
{
}
/*按序号查找Get_Linklist(L,i)
在单链表L中查找第i个元素结点,找到返回其指针,否则返回空*/
LNode*Get_LinkList(LinkListL,inti)
{
}
/*插入运算Insert_LinkList(L,i,x)
在单链表L的第i个位置上插入值为x的元素*/
intInsert_LinkList(LinkListL,inti,datatypex)
{
}
/*删除运算:
Del_LinkList(L,i)
删除单链表L上的第i个数据结点*/
intDel_LinkList(LinkListL,inti)
{
}
voidprint(LinkListL)//输出单链表
{LNode*p=L;
while(p->next!
=NULL)
{printf("%d->",p->data);//输出表中非最后一个元素
p=p->next;
}
printf("%d\n",p->data);//输出表中最后一个元素
}
voidmain()
{
LinkListH;
inti,j,k;
datatypex;
do
{
printf("\n\n\n\n");
printf("\t\t\t链表子系统\n");
printf("\t\t*******************************\n");
printf("\t\t*1----建表 *\n");
printf("\t\t*2----插入 *\n");
printf("\t\t*3----删 除 *\n");
printf("\t\t*4----查 找 *\n");
printf("\t\t*5----显 示 *\n");
printf("\t\t*0----返 回 *\n");
printf("\t\t*******************************\n");
printf("\t\t请选择菜单项(0-5):
");
scanf("%d",&k);getchar();
if(k==1)
H=Creat_LinkList1();//用头插入法建立单链表
elseif(k==2)//在线性表第i位置处插入值为X的元素
{
printf("\n请输入插入的位置i和数据X(输入格式:
i,X):
");
scanf("%d,%d",&i,&x);
j=Insert_LinkList(H,i,x);
}
elseif(k==3)
{printf("\n请输入要删除元素的位置i:
");
scanf("%d",&i);
j=Del_LinkList(H,i);
if(j==1)printf("删除成功!
!
");
elseprintf("删除失败!
!
");
}
elseif(k==4)//查找线性表中元素值为x的位置
{printf("\n请输入要查找的序号i:
");
scanf("%d",&i);
LNode*p;
p=Get_LinkList(H,i);
if(p!
=NULL)
{print(H);printf("中序号为i的地址是%d",p);}
else
printf("链表中无此序号!
!
\n");
}
elseif(k==5)//输出链表
{printf("\n表的存储顺序为:
");
print(H);
}
}while(k!
=0);
}
运
行
结
果
实验人员
实验地点
教师
评语
优
良
中
及格
不及格
批改日期
实验三
实验名称
栈的应用
实验日期
实验目的
1.掌握栈的数据类型描述及栈的特点。
2.掌握栈的顺序和链式两种存储结构的特点及算法描述。
3.掌握栈的5种基本运算及算法在两种不同存储结构上的实现。
实验内容
1.编写链式栈进栈、出栈、显示栈中全部元素的程序。
2.将一个正整数n转换成R进制,要求用顺序栈的来实现。
3.用switch语句设计一个选择式菜单,以菜单方式执行上述操作。
算法描述:
#include"stdio.h"
#include"malloc.h"
typedefintdatatype;
typedefstructnode//定义链式栈结构
{datatypedata;
structnode*next;
}StackNode,*LinkStack;
//置空栈
LinkStackInit_LinkStack()
{
}
//入栈
LinkStackPush_LinkStack(LinkStacktop,datatypex)
{
}
//出栈
LinkStackPop_LinkStack(LinkStacktop,datatype*x)
{
}
voidprint(LinkStacktop)
{StackNode*p=top;
while(p!
=NULL)
{
printf("%d->",p->data);
p=p->next;
}
}
//顺序栈
#defineMAXSIZE1024
typedefstruct
{datatypedata[MAXSIZE];
inttop;
}SeqStack;
//顺序栈置空栈:
首先建立栈空间,然后初始化栈顶指针。
SeqStack*Init_SeqStack()
{SeqStack*s;
s=newSeqStack;
s->top=-1;
returns;
}
//顺序栈判空栈
intEmpty_SeqStack(SeqStack*s)
{if(s->top==-1)return1;
elsereturn0;
}
//顺序栈入栈
intPush_SeqStack(SeqStack*s,datatypex)
{if(s->top==MAXSIZE-1)return0;//栈满不能入栈
else{s->top++;
s->data[s->top]=x;
return1;
}
}
//顺序栈出栈
intPop_SeqStack(SeqStack*s,datatype*x)
{
if(Empty_SeqStack(s))return0;//栈空不能出栈
else{*x=s->data[s->top];
s->top--;return1;//栈顶元素存入*x,返回
}
}
voidconversion(intN,intr)
{SeqStack*s;
datatypex;
s=Init_SeqStack();//初始化栈
printf("\n%d的十进制数转换成%d进制为:
",N,r);
while(N)
{Push_SeqStack(s,N%r);//余数入栈
N=N/r;//商作为被除数继续
}
while(!
Empty_SeqStack(s))
{Pop_SeqStack(s,&x);
printf("%d",x);
}
}
voidmain()
{LinkStacktop;
top=Init_LinkStack();
inti,j,k;
datatypex;
do
{
printf("\n\n\n\n");
printf("\t\t\t栈的应用子系统\n");
printf("\t\t*******************************\n");
printf("\t\t*1----链式进栈 *\n");
printf("\t\t*2----链式出栈 *\n");
printf("\t\t*3----链栈显示 *\n");
printf("\t\t*4----进制转换 *\n");
printf("\t\t*0----返 回 *\n");
printf("\t\t*******************************\n");
printf("\t\t请选择菜单项(0-4):
");
scanf("%d",&k);getchar();
switch(k)
{
case1:
//进栈
printf("\n请输入要进栈的数据X:
");
scanf("%d",&x);
case2:
//出栈
case3:
//打印链式栈中的元素
printf("\n链式栈的元素有:
");
case4:
//进制转换
intN,r;
printf("\n请输入一个整数N=");
printf("\n请输入一个要转换的进制数r=");
}
}
}
运
行
结
果
实验人员
实验地点
教师
评语
优
良
中
及格
不及格
批改日期
实验四
实验名称
队列的应用
实验日期
实验目的
1.掌握队列的数据类型描述及队列的特点。
2.掌握队列的顺序和链式两种存储结构的特点及算法描述。
3.掌握队列的5种基本运算及算法在两种不同存储结构上的实现。
实验内容
1.实现顺序循环或链式队列的进队列、出队列、判断队列空否、显示队列中全部元素的运算。
2.设计一个选择式菜单,以菜单方式选择队列的各种操作。
算法描述:
#include"stdio.h"
#include"malloc.h"
typedefintdatatype;
#defineMAXSIZE50//队列的最大容量
//定义队列的结构体
typedefstruct
{
};
//置空队
//入队
//出队
//判队空
//显示队列
voidmain()
{
c_SeQueue*sq;
LQueue*Lq;
intj,k;
datatypex;
sq=Init_SeQueue();
Lq=Init_LQueue();
do
{
printf("\n\n\n\n");
printf("\t\t\t队列子系统\n");
printf("\t\t*******************************\n");
printf("\t\t*1----进队列 *\n");
printf("\t\t*2----出队列 *\n");
printf("\t\t*3----队列空否 *\n");
printf("\t\t*4----显示队列 *\n");
printf("\t\t*0----返 回 *\n");
printf("\t\t*******************************\n");
printf("\t\t请选择菜单项(0-4):
");
scanf("%d",&k);getchar();
switch(k)
{
case1:
//进队列
printf("\n请输入要进队列的数据:
");
;
;
break;
case2:
//出队列
;
break;
case3:
//判断队列空否
;
if(j==1)printf("此队列为空!
!
!
");
elseprintf("此队列不空。
");
break;
case4:
//显示队列
printf("\n此队列有数据:
");
;
}
}while(k!
=0);
}
运行结果
实验人员
实验地点
教师
评语
优
良
中
及格
不及格
批改日期
实验五
实验名称
二叉树的遍历和应用
实验日期
实验目的
1.掌握二叉树的数据类型描述及二叉树的特性。
2.掌握二叉树的链式存储结构的建立算法。
3.掌握二叉链表上二叉树的基本运算的实现。
实验内容
1.用递归或非递归的方法建立一棵二叉树。
2.用递归实现二叉树的先序、中序、后序三种遍历。
3.求二叉树的深度、叶子结点的个数。
4.设计一个选择式菜单,以菜单方式实现各种操作。
算法描述:
#include"stdio.h"
#include"malloc.h"
typedefcharTelernType;
typedefstructBTreeNode
{
TelernTypedata;//树的数据域为字符型
structBTreeNode*LChild;//*左孩子指针
structBTreeNode*RChild;//*右孩子指针
}BTree;
BTree*CreatBTree()
{
BTree*T;
charx;
scanf("%c",&x);getchar();
if(x=='0')T=NULL;
else
{T=newBTree;
T->data=x;
printf("请输入%c结点的左孩子:
",T->data);
T->LChild=CreatBTree();
printf("请输入%c结点的右孩子:
",T->data);
T->RChild=CreatBTree();
}
returnT;
}
//前序递归遍历二叉树
voidPreOrder(BTree*T)
{
}
voidInOrder(BTree*T)
{
}
voidpostOrder(BTree*T)
{
}
intTreeHeight(BTree*T)
{
intlh,rh;
if(T==NULL)return0;
else
{
lh=TreeHeight(T->LChild);
rh=TreeHeight(T->RChild);
if(lh>rh)returnlh+1;
elsereturnrh+1;
}
}
intcount=0;
voidleafnum(BTree*T)
{
if(T)//树不空
{if(T->LChild==NULL&&T->RChild==NULL)
count++;
leafnum(T->LChild);
leafnum(T->RChild);
}
}
voidmain()
{
BTree*T;
intk;
do
{
printf("\n\n\n\n");
printf("\t\t\t树子系统\n");
printf("\t\t******************************\n");
printf("\t\t*1----建二叉树 *\n"