数据结构实验报告 答案Word下载.docx
- 文档编号:21899209
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:35
- 大小:78.85KB
数据结构实验报告 答案Word下载.docx
《数据结构实验报告 答案Word下载.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告 答案Word下载.docx(35页珍藏版)》请在冰豆网上搜索。
//==========主函数==============
void main()
ﻩchar ch[10],num[5];
ﻩLinkList head;
head=CreatList();
//用头插入法建立单链表,返回头指针
printlist(head);
//遍历链表输出其值
ﻩprintf("
Deletenode (y/n):
"
);
//输入"
y"或"n"
去选择是否删除结点
ﻩscanf("
%s”,num);
ﻩif(strcmp(num,”y"
)==0||strcmp(num,”Y”)==0){
ﻩﻩprintf("
PleaseinputDelete_data:
");
ﻩscanf("
%s",ch);
//输入要删除的字符串
ﻩDeleteList(head,ch);
ﻩprintlist(head);
ﻩ}
printf(”Addnode?
(y/n):
);
//输入"
y"
或"
n"
去选择是否增加结点
ﻩscanf(”%s",num);
ﻩif(strcmp(num,"y"
)==0 ||strcmp(num,"
Y"
)==0)
{
ﻩﻩhead=AddNode(head);
printlist(head);
ﻩDeleteAll(head);
//删除所有结点,释放内存
}
//==========用尾插入法建立带头结点的单链表===========
LinkList CreatListR1(void)
{
char ch[10];
LinkList head=(LinkList)malloc(sizeof(ListNode));
//生成头结点
ListNode*s,*r,*pp;
r=head;
r—>next=NULL;
printf("
Input #toend "
//输入"
#"
代表输入结束
printf(”\nPleaseinputNode_data:
”);
scanf(”%s",ch);
//输入各结点的字符串
while(strcmp(ch,”#”)!
=0){
pp=LocateNode(head,ch);
//按值查找结点,返回结点指针
ﻩif(pp==NULL){ //没有重复的字符串,插入到链表中
ﻩs=(ListNode*)malloc(sizeof(ListNode));
ﻩﻩﻩstrcpy(s-〉data,ch);
r->
next=s;
ﻩﻩr=s;
ﻩr->
next=NULL;
ﻩ}
ﻩprintf(”Input #toend ”);
ﻩﻩprintf("
PleaseinputNode_data:
");
ﻩscanf(”%s",ch);
}
returnhead;
//返回头指针
//==========用头插入法建立带头结点的单链表===========
LinkListCreatList(void)
charch[100];
ﻩLinkListhead,p;
ﻩhead=(LinkList)malloc(sizeof(ListNode));
head->
next=NULL;
ﻩwhile
(1)
ﻩprintf("
Input#toend"
ﻩprintf("PleaseinputNode_data:
”);
ﻩscanf(”%s”,ch);
ﻩif(strcmp(ch,"#”))
ﻩﻩ{
ﻩﻩif(LocateNode(head,ch)==NULL)
ﻩﻩ{
ﻩstrcpy(head-〉data,ch);
ﻩﻩp=(LinkList)malloc(sizeof(ListNode));
ﻩﻩﻩﻩp-〉next=head;
ﻩhead=p;
ﻩﻩ}
ﻩ}
ﻩﻩelse
ﻩbreak;
}
ﻩreturn head;
//==========按值查找结点,找到则返回该结点的位置,否则返回NULL==========
ListNode*LocateNode(LinkListhead,char*key)
ListNode*p=head->
next;
//从开始结点比较
while(p!
=NULL &&strcmp(p—>
data,key)!
=0) //直到p为NULL或p—〉data为key止
p=p—>
next;
//扫描下一个结点
returnp;
//若p=NULL则查找失败,否则p指向找到的值为key的结点
//==========修改程序:
增加节点=======
ListNode*AddNode(LinkListhead)
charch[10];
ﻩListNode *s,*pp;
printf("
\nPleaseinputaNew Node_data:
scanf(”%s”,ch);
ﻩpp=LocateNode(head,ch);
//按值查找结点,返回结点指针
ﻩprintf("
ok2\n"
if(pp==NULL){ //没有重复的字符串,插入到链表中
ﻩs=(ListNode*)malloc(sizeof(ListNode));
ﻩstrcpy(s-〉data,ch);
printf("ok3\n"
s->next=head-〉next;
ﻩhead—>
next=s;
return head;
//==========删除带头结点的单链表中的指定结点=======
voidDeleteList(LinkListhead,char *key)
ListNode*p,*r,*q=head;
p=LocateNode(head,key);
//按key值查找结点的
if(p==NULL){ //若没有找到结点,退出
printf("positionerror”);
exit(0);
}
while(q—>next!
=p) //p为要删除的结点,q为p的前结点
ﻩﻩq=q-〉next;
r=q—〉next;
q—〉next=r—>next;
free(r);
//释放结点
//===========打印链表=======
voidprintlist(LinkListhead)
ListNode*p=head->
next;
//从开始结点打印
while(p){
ﻩprintf(”%s, ",p->data);
ﻩﻩp=p—>
next;
}
printf("
\n");
//==========删除所有结点,释放空间===========
voidDeleteAll(LinkListhead)
ListNode*p=head,*r;
while(p-〉next){
ﻩr=p->
next;
ﻩfree(p);
ﻩp=r;
ﻩfree(p);
}
实验结果:
Input#to endPleaseinputNode_data:
bat
Input#toend Please input Node_data:
cat
Input#toendPleaseinputNode_data:
eat
Input#toend PleaseinputNode_data:
fat
Input#toendPlease inputNode_data:
hat
Input#toendPleaseinputNode_data:
jat
Input #toendPleaseinputNode_data:
lat
Input#toendPlease input Node_data:
mat
Input # toend Please inputNode_data:
#
mat, lat, jat, hat, fat, eat,cat,bat,
Deletenode(y/n):
y
PleaseinputDelete_data:
hat
mat, lat, jat, fat,eat,cat,bat,
Insertnode (y/n):
y
PleaseinputInsert_data:
put
position:
5
mat, lat, jat,fat, eat, put, cat,bat,
请按任意键继续..。
示意图:
心得体会:
本次实验使我们对链表的实质了解更加明确了,对链表的一些基本操作也更加熟练了。
另外实验指导书上给出的代码是有一些问题的,这使我们认识到实验过程中不能想当然的直接编译执行,应当在阅读并完全理解代码的基础上再执行,这才是实验的意义所在.
ﻬ实验2
实验题目:
二叉树操作设计和实现
实验目的:
掌握二叉树的定义、性质及存储方式,各种遍历算法。
采用二叉树链表作为存储结构,完成二叉树的建立,先序、中序和后序以及按层次遍历的操作,求所有叶子及结点总数的操作.
1、分析、理解程序.
2、调试程序,设计一棵二叉树,输入完全二叉树的先序序列,用#代表虚结点(空指针),如ABD###CE##F##,建立二叉树,求出先序、中序和后序以及按层次遍历序列,求所有叶子及结点总数。
实验代码
#include"stdio。
#include”stdlib.h"
#include”string.h”
#defineMax 20 //结点的最大个数
typedefstructnode{
chardata;
struct node*lchild,*rchild;
}BinTNode;
//自定义二叉树的结点类型
typedef BinTNode*BinTree;
//定义二叉树的指针
int NodeNum,leaf;
//NodeNum为结点数,leaf为叶子数
//==========基于先序遍历算法创建二叉树==============
//=====要求输入先序序列,其中加入虚结点”#”以示空指针的位置==========
BinTreeCreatBinTree(void)
BinTreeT;
charch;
if((ch=getchar())=='
#'
)
return(NULL);
//读入#,返回空指针
else{
ﻩT=(BinTNode*)malloc(sizeof(BinTNode));
//生成结点
ﻩﻩT—>
data=ch;
T—>lchild=CreatBinTree();
//构造左子树
ﻩﻩT—>rchild=CreatBinTree();
//构造右子树
ﻩreturn(T);
//========NLR先序遍历=============
void Preorder(BinTree T)
if(T) {
ﻩprintf("
%c"
,T-〉data);
//访问结点
Preorder(T->
lchild);
//先序遍历左子树
Preorder(T->
rchild);
//先序遍历右子树
}
//========LNR中序遍历===============
voidInorder(BinTreeT)
if(T) {
ﻩInorder(T—>
lchild);
//中序遍历左子树
ﻩprintf(”%c”,T->
data);
//访问结点
Inorder(T-〉rchild);
//中序遍历右子树
//==========LRN后序遍历============
void Postorder(BinTreeT)
if(T){
ﻩPostorder(T—〉lchild);
//后序遍历左子树
ﻩPostorder(T->
rchild);
//后序遍历右子树
ﻩprintf(”%c"
,T—〉data);
//访问结点
}
//=====采用后序遍历求二叉树的深度、结点数及叶子数的递归算法========
intTreeDepth(BinTreeT)
int hl,hr,max;
if(T){
hl=TreeDepth(T—〉lchild);
//求左深度
ﻩﻩhr=TreeDepth(T—>
rchild);
//求右深度
ﻩmax=hl>hr?
hl:
hr;
//取左右深度的最大值
ﻩNodeNum=NodeNum+1;
//求结点数
ﻩif(hl==0&&
hr==0)leaf=leaf+1;
//若左右深度为0,即为叶子。
ﻩreturn(max+1);
}
else return(0);
//====利用”先进先出"
(FIFO)队列,按层次遍历二叉树==========
voidLevelorder(BinTreeT)
int front=0,rear=1;
BinTNode*cq[Max],*p;
//定义结点的指针数组cq
cq[1]=T;
//根入队
while(front!
=rear)
{
front=(front+1)%NodeNum;
ﻩp=cq[front];
//出队
ﻩﻩprintf(”%c"
,p-〉data);
//出队,输出结点的值
if(p-〉lchild!
=NULL){
ﻩrear=(rear+1)%NodeNum;
cq[rear]=p—〉lchild;
//左子树入队
ﻩﻩ}
ﻩif(p->rchild!
=NULL){
ﻩ rear=(rear+1)%NodeNum;
ﻩﻩ cq[rear]=p-〉rchild;
//右子树入队
}
//====数叶子节点个数==========
intcountleaf(BinTreeT)
inthl,hr;
if(T){
ﻩhl=countleaf(T->lchild);
hr=countleaf(T—>
rchild);
ﻩif(hl==0&
&
hr==0)//若左右深度为0,即为叶子。
ﻩreturn
(1);
ﻩelsereturnhl+hr;
}
ﻩelsereturn0;
//==========主函数=================
voidmain()
BinTreeroot;
char i;
int depth;
printf(”\n”);
printf("
CreatBin_Tree;
Inputpreorder:
//输入完全二叉树的先序序列,
//用#代表虚结点,如ABD###CE##F##
root=CreatBinTree();
//创建二叉树,返回根结点
do { //从菜单中选择遍历方式,输入序号。
ﻩprintf("\t********** select ************\n"
ﻩprintf("\t1:
Preorder Traversal\n”);
ﻩprintf("
\t2:
IorderTraversal\n”);
printf("\t3:
Postordertraversal\n"
printf("
\t4:
PostTreeDepth,Nodenumber,Leafnumber\n");
ﻩprintf("\t5:
LevelDepth\n"
//按层次遍历之前,先选择4,求出该树的结点数。
\t0:
Exit\n"
printf("\t*******************************\n”);
fflush(stdin);
%c”,&
i);
//输入菜单序号(0-5)
switch(i—’0'){
ﻩcase 1:
printf("
PrintBin_treePreorder:
”);
ﻩPreorder(root);
//先序遍历
ﻩﻩbreak;
ﻩcase2:
printf("PrintBin_TreeInorder:
"
ﻩInorder(root);
//中序遍历
break;
case 3:
printf(”PrintBin_TreePostorder:
");
ﻩPostorder(root);
//后序遍历
break;
case 4:
depth=TreeDepth(root);
//求树的深度及叶子数
ﻩﻩprintf("BinTree Depth=%dBinTreeNodenumber=%d”,depth,NodeNum);
BinTreeLeaf number=%d”,countleaf(root));
ﻩﻩbreak;
ﻩcase5:
printf(”LevePrint Bin_Tree:
”);
Levelorder(root);
//按层次遍历
ﻩﻩbreak;
ﻩdefault:
exit(1);
printf(”\n”);
} while(i!
=0);
}
CreatBin_Tree;
Input preorder:
ABD###CE##F##
**********select ************
1:
PreorderTraversal
2:
IorderTraversal
3:
Postorder traversal
4:
PostTreeDepth,Node number,Leaf number
5:
Level Depth
0:
Exit
*******************************
1
PrintBin_treePreorder:
ABDCEF
2
PrintBin_TreeInorder:
DBAECF
3
PrintBin_Tree Postorder:
DBEFCA
4
BinTreeDepth=3BinTreeNodenumber=6BinTreeLeafnumber=3
5
LevePrintBin_Tree:
ABCDEF
0
Pressanykeytocontinue
二叉树示意图
心得体会:
这次实验加深了我对二叉树的印象,尤其是对二叉树的各种遍历操作有了一定的了解.同时认识到,在设计程序时辅以图形化的描述是非常有用处的。
实验3
图的遍历操作
掌握有向图和无向图的概念;
掌握邻接矩阵和邻接链表建立图的存储结构;
掌握DFS及BFS对图的遍历操作;
了解图结构在人工智能、工程等领域的广泛应用。
采用邻接矩阵和邻接链表作为图的存储结构,完成有向图和无向图的DFS和BFS操作.
设计一个有向图和一个无向图,任选一种存储结构,完成有向图和无向图的DFS(深度优先遍历)和BFS(广度优先遍历)的操作.
1.邻接矩阵作为存储结构
#include”stdio。
#include”stdlib.h"
#defineMaxVertexNum100 //定义最大顶点数
typedefstruct{
charvexs[MaxVertexNum];
//顶点表
int edges[MaxVerte
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构实验报告 答案 数据结构 实验 报告