数据结构实验报告.docx
《数据结构实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告.docx(31页珍藏版)》请在冰豆网上搜索。
数据结构实验报告
院系:
计算机科学学院
专业:
网络工程
年级:
2012
课程名称:
数据结构
学号:
2012213773
姓名:
黄勇
指导教师:
吴立锋
2014年6月日
年级
班号
1201
组号
学号
专业
姓名
实验名称
第二章线性表
实验室
实
验
目
的
或
要
求
了解线性表的逻辑结构和各种存储表示方法,以及定义在逻辑结构上的各种基本运算及其在某种存储结构上如何实现这些基本运算。
在熟悉上述内容的基础上,能够针对具体应用问题的要求和性质,选择合适的存储结构设计出相应的有效算法,解决与线性表相关的实际问题。
原
理
(
算
法
流
程
)
1、实验内容
单链表的各种基本操作,包括创建,查找,插入,删除,输出,合并等
2、存储结构描述及说明
链式存储结构
typedefstructnode{chardata;structnode*next;}linklist;
3、函数说明
linklist*rcrect(linklist*head)尾插法建立单链表
voidprint(linklist*head)输出函数,输出单链表。
linklistlocation(linklist*head)按序号查找函数,按序号查找单链表中数据。
linklistinset(linklist*head)插入函数,在单链表中插入数据。
linklistdelet(linklist*head)删除函数,删除单链表中的数据。
intmain()主函数,程序运行调用各子函数。
4、模块之间的调用关系
程序清单:
#include
typedefstructnode//定义节点类型
{
chardata;
structnode*next;//因为上面结构体的类型名是structnodelinklist是别名
}linklist;//一般List顺序表,linklist链表
intmain()
inta;
linklist*head;
head=(linklist*)malloc(sizeof(linklist));
printf("请先建立单链表!
\n");
linklist*rcrect(linklist*head);//调用尾插法
rcrect(head);
/*linklist*hcrect();//或者调用头插法
hcrect();*/
for(;;)
printf("\n您想要对此单链表表做何种操作:
\n0.退出\t1.查找\t2.插入\t3.删除\n");
scanf("%d",&a);
if(a<0||a>3)
printf("您输入的数字有误,请重新输入!
if(a==0)//退出
exit(0);
if(a==1)
linklistlocation(linklist*head);//调用按序号查找函数
location(head);
}
if(a==2)
linklistinset(linklist*head);//调用插入函数
inset(head);
if(a==3)//调用删除函数
linklistdelet(linklist*head);//调用删除函数
delet(head);
return0;
//1.尾插法建立单链表
linklist*rcrect(linklist*head)//尾插法链接到已经建立好的单链表的末尾
linklist*p,*last;
charch;//用于输入字符
last=head;
printf("请输入你要存储的字符,以!
号结束:
while(ch!
='!
')
p=(linklist*)malloc(sizeof(linklist));
scanf("%c",&ch);
p->data=ch;//每次都申请一个节点,数据域存放数据,指针域为空//printf("%c\t",p->data);可以用来测试存储是否正确
last->next=p;
last=p;//上一次的最后一个元素的地址赋给last
p->next=NULL;
voidprint(linklist*head);//调用输出函数
print(head);
returnhead;
//2.输出函数函数
voidprint(linklist*head)
linklist*p;
p=head->next;
printf("\n你存储的数据为:
while(p!
=NULL)
printf("%c\t",p->data);
p=p->next;
//3.按序号查找函数
linklistlocation(linklist*head)
inti,k=0;
p=head;
printf("\n请输入你要查找链表中第几个元素:
scanf("%d",&i);
while(p&&k
k++;
if(k>i||!
p)
printf("输入的序号有误,查找失败!
else
printf("第%d个元素的值为:
%c\n",i,p->data);
return*head;
//4.插入函数
linklistinset(linklist*head)
linklist*p,*p1;
charch;
p=head;//不能为head->next
printf("请输入你要在链表的第几个位置?
\t插入什么元素?
scanf("%d%c",&i,&ch);
p1=(linklist*)malloc(sizeof(linklist));//新建一个节点
p1->data=ch;
p1->next=NULL;
while(p&&k{p=p->next;k++;}if(k>i-1||!p){printf("输入的序号有误,插入失败!\n");exit(0);}else{p1->next=p->next;p->next=p1;printf("插入后的新数据为:\n");//输出插入后的新数据p=head->next;while(p!=NULL){printf("%c\t",p->data);p=p->next;}printf("\n");}return*head;}//5.删除函数linklistdelet(linklist*head){linklist*p,*p1,*p2;p=head;inti,k=0;printf("请输入你要删除第几个元素:\n");scanf("%d",&i);while(p&&k{p=p->next;k++;}if(k>i-1||!p){printf("输入的序号有误,删除失败!\n");exit(0);}else{p2=p->next;p->next=p2->next;free(p2);printf("删除后的新数据为:\n");//输出插入后的新数据p=head->next;while(p!=NULL){printf("%c\t",p->data);p=p->next;}printf("\n");}return*head;} 组内分工(可选)无实验结果分析及心得体会实验结果截图: 心得体会:通过本次实验对于线性表的运用更熟练了,对于单链表的建立,删除,插入,输出更加熟悉。成绩评定 教师签名:年月日 年级 2012班号1201组号 学号 2012213773专业网络工程 姓名 黄勇实验名称 第三章栈和队列实验室实验目的或要求 在掌握栈(队列)特点的基础上,懂得在什么样的情况下能够使用栈(队列)。能熟练使用栈(队列)的一种存储表示,以及在该存储结构上如何实现栈(队列)的基本操作。在熟悉上述内容的基础上,能够针对具体应用问题的特点,选择栈(队列)设计出相应的有效算法,解决与栈(队列)相关的实际问题。实验原理(算法流程) 1、实验内容括号匹配的检验。合法的括号包括()和【】两类,利用栈判断任意输入的一个括号序列是否匹配对出现,若是输出“right“,否则输出”error!“。且提示错误原因。2、存储结构描述及说明typedefstruct{int*base;int*top;intstacksize;}SqStack;顺序存储结构3、函数说明intInitStack(SqStack*S)构造函数,构造一个空栈S,该栈预定义大小为STACK_INIT_SIZEintpush(SqStack*S,inte)插入函数,在栈S中插入元素e为新的栈顶元素。intpop(SqStack*S,int*e)删除函数,若栈不空,则删除S的栈顶元素,用e返回其值,并返回1;否则返回ERRORvoidmatch(charstr[])检测函数,对输入的表达式进行检测,括号是否匹配,匹配则返回配对,否则返回不配对。intmain()主函数。4、模块之间的调用关系 程序清单:#include"stdio.h"#include"conio.h"#include"stdlib.h"#defineERROR-1#defineSTACK_INIT_SIZE100#defineSTACKINCREMENT10typedefstruct{int*base;int*top;intstacksize;}SqStack;intInitStack(SqStack*S){S->base=(int*)malloc(STACK_INIT_SIZE*sizeof(int));if(!S->base){printf("\n磁盘不足.\n");getch();exit(ERROR);}S->top=S->base;S->stacksize=STACK_INIT_SIZE;return1;}intpush(SqStack*S,inte){if(S->top-S->base>=S->stacksize){S->base=(int*)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(int));if(!S->base){printf("\n磁盘不足.\n");getch();exit(ERROR);}S->top=S->base+S->stacksize;S->stacksize+=STACKINCREMENT;}*S->top++=e;return1;}intpop(SqStack*S,int*e){if(S->top==S->base){printf("\n栈已满.\n");returnERROR;}*e=*--S->top;return1;}voidmatch(charstr[]){SqStackS;char*p;inte;InitStack(&S);p=str;while(*p){if(*p=='('||*p=='['||*p=='{')push(&S,*p);elseif(*p==')'||*p==']'||*p=='}'){if(*(S.top-1)+1==*p||*(S.top-1)+2==*p)pop(&S,&e);else{printf("\n不配对.\n");return;}}p++;}if(S.top==S.base)printf("\n配对.\n");elseprintf("\n不配对!\n");}intmain(){charstr[100];printf("\n输入表达式:\n");gets(str);match(str);getch();return0;}组内分工(可选)无实验结果分析及心得体会实验结果截图:心得体会:通过本次实验,对于栈的运用更加熟练,对于栈的应用有了初步认识,在以后的学习中加深对于栈的认识,对于数据结构有了更深刻的印象。成绩评定 教师签名:年月日 年级 2012班号 1201组号 学号2012213773 专业网络工程 姓名 黄勇实验名称 第六章树和二叉树实验室实验目的或要求了解二叉树的定义、性质、存储结构等相关知识,在熟悉这些内容的基础上掌握二叉树在某种存储结构下遍历以及相关算法的实现及应用,能根据本章所学到的有关知识设计出有效的算法。 实验原理(算法流程) 1、实验内容二叉树的相关演示操作。自定义结点结构,以二叉链表为存储结构,完成以下功能:1)以先序递归放松创建一棵二叉树。2)输出二叉树的先序、中序和后序递归或非递归遍历下的结点访问次序;3)输出二叉树所有的叶子节点和叶子节点个数;4)输出二叉树的高度;5)输出二叉树的按层次遍历序列(选作)6)输出二叉树的形状(选作)2、存储结构描述及说明二叉链表存储结构。3、函数说明BinTreeCreatBinTree(void)输入先序序列,其中加入虚结点"#"以示空指针的位置构造二叉树voidPreorder(BinTreeT)先序遍历二叉树函数,以先序递归遍历二叉树,输出先序遍历。voidInorder(BinTreeT)中序遍历二叉树函数,以中序递归遍历二叉树,输出中序遍历。voidPostorder(BinTreeT)后序遍历二叉树函数,以后序递归遍历二叉树,输出后序遍历。intTreeDepth(BinTreeT)求二叉树深度及叶子节点数函数,采用后序遍历求二叉树的深度、结点数及叶子数并输出。voidmain()主函数。4、模块之间的调用关系 程序清单:#include"stdio.h"#include"string.h"#include"stdlib.h"#defineMax20//结点的最大个数typedefstructnode{chardata;structnode*lchild,*rchild;}BinTNode;//自定义二叉树的结点类型typedefBinTNode*BinTree;//定义二叉树的指针intNodeNum,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先序遍历=============voidPreorder(BinTreeT){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后序遍历============voidPostorder(BinTreeT){if(T){Postorder(T->lchild);//后序遍历左子树Postorder(T->rchild);//后序遍历右子树printf("%c",T->data);//访问结点}}//=====采用后序遍历求二叉树的深度、结点数及叶子数的递归算法========intTreeDepth(BinTreeT){inthl,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);}elsereturn(0);}//==========主函数=================voidmain(){BinTreeroot;inti,depth;printf("\n");printf("输入二叉树的先序序列创建二叉树,用#代表空结点:");//输入完全二叉树的先序序列,//用#代表虚结点,如ABD###CE##F##root=CreatBinTree();//创建二叉树,返回根结点//do{//从菜单中选择遍历方式,输入序号。printf("\t**********菜单************\n");printf("\t1:先序遍历\n");printf("\t2:中序遍历\n");printf("\t3:后序遍历\n");printf("\t4:求树的深度及叶子节点数\n");printf("\t0:退出\n");printf("\t*******************************\n");do{//从菜单中选择遍历方式,输入序号。scanf("%d",&i);//输入菜单序号(0-5)switch(i){case1:printf("先序遍历为:");Preorder(root);//先序遍历break;case2:printf("中序遍历为:");Inorder(root);//中序遍历break;case3:printf("后序遍历为:");Postorder(root);//后序遍历break;case4:depth=TreeDepth(root);//求树的深度及叶子节点数printf("树的深度=%d树的叶子节点=%d",depth,NodeNum);break;default:exit(1);}printf("\n");}while(i!=0);} (写不完时,可另加附页。)组内分工(可选)无实验结果分析及心得体会实验结果截图:心得体会:通过本次实验对于二叉树的运用更熟练,对于二叉树的先序、中序和后序遍历更加熟悉。成绩评定 教师签名:年月日 年级 2012班号 1201组号 学号 2012213773专业网络工程 姓名黄勇 实验名称 第七章图实验室实验目的或要求了解图的基本概念,理解几种常用的存储结构、两种遍历算法以及图的应用算法,在熟悉这些内容的基础上,重点掌握图在邻接表这种存储结构下遍历算法的实现。 实验原理(算法流程) 1、实验内容图在采用邻接表的存储结构下的基本操作,包括图的创建、图的深度优先搜索和广度优先搜索。2、存储结构描述及说明邻接表存储结构。typedefstructst_arc{intadjvex;intweight;structst_arc*nextarc;}arcnode;typedefstruct{intvertex;structst_arc*firstarc;
if(k>i-1||!
printf("输入的序号有误,插入失败!
p1->next=p->next;
p->next=p1;
printf("插入后的新数据为:
\n");//输出插入后的新数据
printf("\n");
//5.删除函数
linklistdelet(linklist*head)
linklist*p,*p1,*p2;
printf("请输入你要删除第几个元素:
while(p&&k{p=p->next;k++;}if(k>i-1||!p){printf("输入的序号有误,删除失败!\n");exit(0);}else{p2=p->next;p->next=p2->next;free(p2);printf("删除后的新数据为:\n");//输出插入后的新数据p=head->next;while(p!=NULL){printf("%c\t",p->data);p=p->next;}printf("\n");}return*head;} 组内分工(可选)无实验结果分析及心得体会实验结果截图: 心得体会:通过本次实验对于线性表的运用更熟练了,对于单链表的建立,删除,插入,输出更加熟悉。成绩评定 教师签名:年月日 年级 2012班号1201组号 学号 2012213773专业网络工程 姓名 黄勇实验名称 第三章栈和队列实验室实验目的或要求 在掌握栈(队列)特点的基础上,懂得在什么样的情况下能够使用栈(队列)。能熟练使用栈(队列)的一种存储表示,以及在该存储结构上如何实现栈(队列)的基本操作。在熟悉上述内容的基础上,能够针对具体应用问题的特点,选择栈(队列)设计出相应的有效算法,解决与栈(队列)相关的实际问题。实验原理(算法流程) 1、实验内容括号匹配的检验。合法的括号包括()和【】两类,利用栈判断任意输入的一个括号序列是否匹配对出现,若是输出“right“,否则输出”error!“。且提示错误原因。2、存储结构描述及说明typedefstruct{int*base;int*top;intstacksize;}SqStack;顺序存储结构3、函数说明intInitStack(SqStack*S)构造函数,构造一个空栈S,该栈预定义大小为STACK_INIT_SIZEintpush(SqStack*S,inte)插入函数,在栈S中插入元素e为新的栈顶元素。intpop(SqStack*S,int*e)删除函数,若栈不空,则删除S的栈顶元素,用e返回其值,并返回1;否则返回ERRORvoidmatch(charstr[])检测函数,对输入的表达式进行检测,括号是否匹配,匹配则返回配对,否则返回不配对。intmain()主函数。4、模块之间的调用关系 程序清单:#include"stdio.h"#include"conio.h"#include"stdlib.h"#defineERROR-1#defineSTACK_INIT_SIZE100#defineSTACKINCREMENT10typedefstruct{int*base;int*top;intstacksize;}SqStack;intInitStack(SqStack*S){S->base=(int*)malloc(STACK_INIT_SIZE*sizeof(int));if(!S->base){printf("\n磁盘不足.\n");getch();exit(ERROR);}S->top=S->base;S->stacksize=STACK_INIT_SIZE;return1;}intpush(SqStack*S,inte){if(S->top-S->base>=S->stacksize){S->base=(int*)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(int));if(!S->base){printf("\n磁盘不足.\n");getch();exit(ERROR);}S->top=S->base+S->stacksize;S->stacksize+=STACKINCREMENT;}*S->top++=e;return1;}intpop(SqStack*S,int*e){if(S->top==S->base){printf("\n栈已满.\n");returnERROR;}*e=*--S->top;return1;}voidmatch(charstr[]){SqStackS;char*p;inte;InitStack(&S);p=str;while(*p){if(*p=='('||*p=='['||*p=='{')push(&S,*p);elseif(*p==')'||*p==']'||*p=='}'){if(*(S.top-1)+1==*p||*(S.top-1)+2==*p)pop(&S,&e);else{printf("\n不配对.\n");return;}}p++;}if(S.top==S.base)printf("\n配对.\n");elseprintf("\n不配对!\n");}intmain(){charstr[100];printf("\n输入表达式:\n");gets(str);match(str);getch();return0;}组内分工(可选)无实验结果分析及心得体会实验结果截图:心得体会:通过本次实验,对于栈的运用更加熟练,对于栈的应用有了初步认识,在以后的学习中加深对于栈的认识,对于数据结构有了更深刻的印象。成绩评定 教师签名:年月日 年级 2012班号 1201组号 学号2012213773 专业网络工程 姓名 黄勇实验名称 第六章树和二叉树实验室实验目的或要求了解二叉树的定义、性质、存储结构等相关知识,在熟悉这些内容的基础上掌握二叉树在某种存储结构下遍历以及相关算法的实现及应用,能根据本章所学到的有关知识设计出有效的算法。 实验原理(算法流程) 1、实验内容二叉树的相关演示操作。自定义结点结构,以二叉链表为存储结构,完成以下功能:1)以先序递归放松创建一棵二叉树。2)输出二叉树的先序、中序和后序递归或非递归遍历下的结点访问次序;3)输出二叉树所有的叶子节点和叶子节点个数;4)输出二叉树的高度;5)输出二叉树的按层次遍历序列(选作)6)输出二叉树的形状(选作)2、存储结构描述及说明二叉链表存储结构。3、函数说明BinTreeCreatBinTree(void)输入先序序列,其中加入虚结点"#"以示空指针的位置构造二叉树voidPreorder(BinTreeT)先序遍历二叉树函数,以先序递归遍历二叉树,输出先序遍历。voidInorder(BinTreeT)中序遍历二叉树函数,以中序递归遍历二叉树,输出中序遍历。voidPostorder(BinTreeT)后序遍历二叉树函数,以后序递归遍历二叉树,输出后序遍历。intTreeDepth(BinTreeT)求二叉树深度及叶子节点数函数,采用后序遍历求二叉树的深度、结点数及叶子数并输出。voidmain()主函数。4、模块之间的调用关系 程序清单:#include"stdio.h"#include"string.h"#include"stdlib.h"#defineMax20//结点的最大个数typedefstructnode{chardata;structnode*lchild,*rchild;}BinTNode;//自定义二叉树的结点类型typedefBinTNode*BinTree;//定义二叉树的指针intNodeNum,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先序遍历=============voidPreorder(BinTreeT){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后序遍历============voidPostorder(BinTreeT){if(T){Postorder(T->lchild);//后序遍历左子树Postorder(T->rchild);//后序遍历右子树printf("%c",T->data);//访问结点}}//=====采用后序遍历求二叉树的深度、结点数及叶子数的递归算法========intTreeDepth(BinTreeT){inthl,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);}elsereturn(0);}//==========主函数=================voidmain(){BinTreeroot;inti,depth;printf("\n");printf("输入二叉树的先序序列创建二叉树,用#代表空结点:");//输入完全二叉树的先序序列,//用#代表虚结点,如ABD###CE##F##root=CreatBinTree();//创建二叉树,返回根结点//do{//从菜单中选择遍历方式,输入序号。printf("\t**********菜单************\n");printf("\t1:先序遍历\n");printf("\t2:中序遍历\n");printf("\t3:后序遍历\n");printf("\t4:求树的深度及叶子节点数\n");printf("\t0:退出\n");printf("\t*******************************\n");do{//从菜单中选择遍历方式,输入序号。scanf("%d",&i);//输入菜单序号(0-5)switch(i){case1:printf("先序遍历为:");Preorder(root);//先序遍历break;case2:printf("中序遍历为:");Inorder(root);//中序遍历break;case3:printf("后序遍历为:");Postorder(root);//后序遍历break;case4:depth=TreeDepth(root);//求树的深度及叶子节点数printf("树的深度=%d树的叶子节点=%d",depth,NodeNum);break;default:exit(1);}printf("\n");}while(i!=0);} (写不完时,可另加附页。)组内分工(可选)无实验结果分析及心得体会实验结果截图:心得体会:通过本次实验对于二叉树的运用更熟练,对于二叉树的先序、中序和后序遍历更加熟悉。成绩评定 教师签名:年月日 年级 2012班号 1201组号 学号 2012213773专业网络工程 姓名黄勇 实验名称 第七章图实验室实验目的或要求了解图的基本概念,理解几种常用的存储结构、两种遍历算法以及图的应用算法,在熟悉这些内容的基础上,重点掌握图在邻接表这种存储结构下遍历算法的实现。 实验原理(算法流程) 1、实验内容图在采用邻接表的存储结构下的基本操作,包括图的创建、图的深度优先搜索和广度优先搜索。2、存储结构描述及说明邻接表存储结构。typedefstructst_arc{intadjvex;intweight;structst_arc*nextarc;}arcnode;typedefstruct{intvertex;structst_arc*firstarc;
printf("输入的序号有误,删除失败!
{p2=p->next;
p->next=p2->next;
free(p2);
printf("删除后的新数据为:
{printf("%c\t",p->data);
}printf("\n");
return*head;}
组
内
分
工
可
选
无
结
果
析
及
心
得
体
会
实验结果截图:
心得体会:
通过本次实验对于线性表的运用更熟练了,对于单链表的建立,删除,插入,输出更加熟悉。
成
绩
评
定
教师签名:
年月日
第三章栈和队列
在掌握栈(队列)特点的基础上,懂得在什么样的情况下能够使用栈(队列)。
能熟练使用栈(队列)的一种存储表示,以及在该存储结构上如何实现栈(队列)的基本操作。
在熟悉上述内容的基础上,能够针对具体应用问题的特点,选择栈(队列)设计出相应的有效算法,解决与栈(队列)相关的实际问题。
括号匹配的检验。
合法的括号包括()和【】两类,利用栈判断任意输入的一个括号序列是否匹配对出现,若是输出“right“,否则输出”error!
“。
且提示错误原因。
typedefstruct
int*base;
int*top;
intstacksize;
}SqStack;顺序存储结构
intInitStack(SqStack*S)构造函数,构造一个空栈S,该栈预定义大小为STACK_INIT_SIZE
intpush(SqStack*S,inte)插入函数,在栈S中插入元素e为新的栈顶元素。
intpop(SqStack*S,int*e)删除函数,若栈不空,则删除S的栈顶元素,用e返回其值,并返回1;否则返回ERROR
voidmatch(charstr[])检测函数,对输入的表达式进行检测,括号是否匹配,匹配则返回配对,否则返回不配对。
intmain()主函数。
#include"stdio.h"
#include"conio.h"
#include"stdlib.h"
#defineERROR-1
#defineSTACK_INIT_SIZE100
#defineSTACKINCREMENT10
}SqStack;
intInitStack(SqStack*S)
S->base=(int*)malloc(STACK_INIT_SIZE*sizeof(int));
if(!
S->base)
printf("\n磁盘不足.\n");
getch();
exit(ERROR);
S->top=S->base;
S->stacksize=STACK_INIT_SIZE;
return1;
intpush(SqStack*S,inte)
if(S->top-S->base>=S->stacksize)
S->base=(int*)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(int));
S->top=S->base+S->stacksize;
S->stacksize+=STACKINCREMENT;
*S->top++=e;
intpop(SqStack*S,int*e)
if(S->top==S->base)
printf("\n栈已满.\n");
returnERROR;
*e=*--S->top;
voidmatch(charstr[])
SqStackS;
char*p;
inte;
InitStack(&S);
p=str;
while(*p)
if(*p=='('||*p=='['||*p=='{')
push(&S,*p);
elseif(*p==')'||*p==']'||*p=='}')
if(*(S.top-1)+1==*p||*(S.top-1)+2==*p)
pop(&S,&e);
printf("\n不配对.\n");
return;
p++;
if(S.top==S.base)
printf("\n配对.\n");
printf("\n不配对!
charstr[100];
printf("\n输入表达式:
gets(str);
match(str);
通过本次实验,对于栈的运用更加熟练,对于栈的应用有了初步认识,在以后的学习中加深对于栈的认识,对于数据结构有了更深刻的印象。
第六章树和二叉树
了解二叉树的定义、性质、存储结构等相关知识,在熟悉这些内容的基础上掌握二叉树在某种存储结构下遍历以及相关算法的实现及应用,能根据本章所学到的有关知识设计出有效的算法。
二叉树的相关演示操作。
自定义结点结构,以二叉链表为存储结构,完成以下功能:
1)以先序递归放松创建一棵二叉树。
2)输出二叉树的先序、中序和后序递归或非递归遍历下的结点访问次序;
3)输出二叉树所有的叶子节点和叶子节点个数;
4)输出二叉树的高度;
5)输出二叉树的按层次遍历序列(选作)
6)输出二叉树的形状(选作)
二叉链表存储结构。
BinTreeCreatBinTree(void)输入先序序列,其中加入虚结点"#"以示空指针的位置构造二叉树
voidPreorder(BinTreeT)先序遍历二叉树函数,以先序递归遍历二叉树,输出先序遍历。
voidInorder(BinTreeT)中序遍历二叉树函数,以中序递归遍历二叉树,输出中序遍历。
voidPostorder(BinTreeT)后序遍历二叉树函数,以后序递归遍历二叉树,输出后序遍历。
intTreeDepth(BinTreeT)求二叉树深度及叶子节点数函数,采用后序遍历求二叉树的深度、结点数及叶子数并输出。
voidmain()主函数。
#include"string.h"
#defineMax20//结点的最大个数
typedefstructnode{
structnode*lchild,*rchild;
}BinTNode;//自定义二叉树的结点类型
typedefBinTNode*BinTree;//定义二叉树的指针
intNodeNum,leaf;//NodeNum为结点数,leaf为叶子数
//==========基于先序遍历算法创建二叉树==============
//=====要求输入先序序列,其中加入虚结点"#"以示空指针的位置==========
BinTreeCreatBinTree(void)
BinTreeT;
if((ch=getchar())=='#')
return(NULL);//读入#,返回空指针
else{
T=(BinTNode*)malloc(sizeof(BinTNode));//生成结点
T->data=ch;
T->lchild=CreatBinTree();//构造左子树
T->rchild=CreatBinTree();//构造右子树
return(T);
//========NLR先序遍历=============
voidPreorder(BinTreeT)
if(T){
printf("%c",T->data);//访问结点
Preorder(T->lchild);//先序遍历左子树
Preorder(T->rchild);//先序遍历右子树
//========LNR中序遍历===============
voidInorder(BinTreeT)
Inorder(T->lchild);//中序遍历左子树
Inorder(T->rchild);//中序遍历右子树
//==========LRN后序遍历============
voidPostorder(BinTreeT)
Postorder(T->lchild);//后序遍历左子树
Postorder(T->rchild);//后序遍历右子树
//=====采用后序遍历求二叉树的深度、结点数及叶子数的递归算法========
intTreeDepth(BinTreeT)
inthl,hr,max;
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);
elsereturn(0);
//==========主函数=================
voidmain()
BinTreeroot;
inti,depth;
printf("输入二叉树的先序序列创建二叉树,用#代表空结点:
");//输入完全二叉树的先序序列,
//用#代表虚结点,如ABD###CE##F##
root=CreatBinTree();//创建二叉树,返回根结点
//do{//从菜单中选择遍历方式,输入序号。
printf("\t**********菜单************\n");
printf("\t1:
先序遍历\n");
printf("\t2:
中序遍历\n");
printf("\t3:
后序遍历\n");
printf("\t4:
求树的深度及叶子节点数\n");
printf("\t0:
退出\n");
printf("\t*******************************\n");
do{//从菜单中选择遍历方式,输入序号。
scanf("%d",&i);//输入菜单序号(0-5)
switch(i){
case1:
printf("先序遍历为:
");
Preorder(root);//先序遍历
break;
case2:
printf("中序遍历为:
Inorder(root);//中序遍历
case3:
printf("后序遍历为:
Postorder(root);//后序遍历
case4:
depth=TreeDepth(root);//求树的深度及叶子节点数
printf("树的深度=%d树的叶子节点=%d",depth,NodeNum);
default:
exit
(1);
}while(i!
=0);
(写不完时,可另加附页。
通过本次实验对于二叉树的运用更熟练,对于二叉树的先序、中序和后序遍历更加熟悉。
第七章图
了解图的基本概念,理解几种常用的存储结构、两种遍历算法以及图的应用算法,在熟悉这些内容的基础上,重点掌握图在邻接表这种存储结构下遍历算法的实现。
图在采用邻接表的存储结构下的基本操作,包括图的创建、图的深度优先搜索和广度优先搜索。
邻接表存储结构。
typedefstructst_arc
intadjvex;
intweight;
structst_arc*nextarc;
}arcnode;
intvertex;
structst_arc*firstarc;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1