数据结构报告.docx
- 文档编号:26260235
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:26
- 大小:129KB
数据结构报告.docx
《数据结构报告.docx》由会员分享,可在线阅读,更多相关《数据结构报告.docx(26页珍藏版)》请在冰豆网上搜索。
数据结构报告
【问题定义】创建二叉树时,先输入根结点,再输入左子树,最后输入右子树的次序输入各结点的值,结点类型为字符型。
依次遍历此二叉树,查找某结点的父结点,二叉树的高度及其结点总数。
【问题分析】建立二叉树时输入序列为:
ab#d##ce##f##,其中#表示空结点,则建立二叉树的二叉链表如下图所示,分别先序遍历、中序遍历、后序遍历、层序遍历此二叉树。
查找某结点的父结点,二叉树的高度及结点总数。
【逻辑结构】程序中的各个结构函数如下:
#include"stdio.h"#include"stdlib.h"
typedefstructBiTNode{chardata;structBiTNode*lchild,*rchild;}BiTNode,*BiTree;
BiTreeCreateBiTree()voidpreorder(BiTreeroot)
voidinorder(BiTreeroot)voidpostorder(BiTreeroot)
BiTreefindNode(BiTreet,charx)voidLevelOrder(BiTreet)
intcounter(BiTNode*t)intdepth(BiTNode*t)
BiTNode*findparent(BiTNode*t,BiTNode*q)
通过main函数来调用各个结构的函数来实现程序。
【存储结构】
a
b
^
c
^
d
^
^
e
^
^
f
^
不带头结点的二叉链表
【算法思路】
创建一个二叉链表来储存输入的各个结点的数值。
先序遍历、中序遍历、后序遍历、层序遍历此二叉树,查找某结点的父结点,求出二叉树的高度及其结点总数。
根据上述内容写得如下算法:
#include"stdio.h"
#include"stdlib.h"
typedefstructBiTNode{
chardata;
structBiTNode*lchild,*rchild;
}BiTNode,*BiTree;
BiTreeCreateBiTree(){
charch;
BiTreeT;
scanf("%c",&ch);
if(ch=='#')T=NULL;
else{
if(!
(T=(BiTree)malloc(sizeof(BiTNode))))return(0);
T->data=ch;
T->lchild=CreateBiTree();
T->rchild=CreateBiTree();
}
return(T);
}
voidpreorder(BiTreeroot){
if(root){
printf("%c",root->data);
preorder(root->lchild);
preorder(root->rchild);
}
}
voidinorder(BiTreeroot){
if(root){
inorder(root->lchild);
printf("%c",root->data);
inorder(root->rchild);
}
}
voidpostorder(BiTreeroot){
if(root){
postorder(root->lchild);
postorder(root->rchild);
printf("%c",root->data);
}
}
BiTreefindNode(BiTreet,charx){
BiTreep;
if(!
t)return(NULL);
elseif(t->data==x)return(t);
else{
p=findNode(t->lchild,x);
if(!
p)p=findNode(t->rchild,x);
return(p);
}
}
voidLevelOrder(BiTreet){
BiTreeT;
charq[20];
inti=-1,j=-1;
T=t;
if(T!
=NULL){i++;q[i]=T->data;}
while(j
j++;
T=findNode(t,q[j]);
if(T->lchild!
=NULL){i++;q[i]=T->lchild->data;}
if(T->rchild!
=NULL){i++;q[i]=T->rchild->data;}
}
for(j=0;j<=i;j++)printf("%c",q[j]);
}
intcounter(BiTNode*t)
{ints;
if(t==NULL)return(0);
elses=counter(t->lchild)+counter(t->rchild)+1;
return(s);
}
intdepth(BiTNode*t)
{intdep1,dep2;
if(t==NULL)return(0);
else{dep1=depth(t->lchild);
dep2=depth(t->rchild);
if(dep1>dep2)return(dep1+1);
elsereturn(dep2+1);
}}
BiTNode*findparent(BiTNode*t,BiTNode*q)
{BiTNode*p,*s;
if(t==NULL)s=NULL;
elseif(t->lchild==q||t->rchild==q)s=t;
else{p=findparent(t->lchild,q);
if(p==NULL)p=findparent(t->rchild,q);
s=p;
}
return(s);
}
voidmain(){
BiTNode*T,*p,*q;
charch;intm,n,h;
printf("请按照先序顺序输入您要建立的二叉树(空孩子用#表示):
\n");
T=CreateBiTree();
while
(1)
{
printf("1.遍历此二叉树\n");
printf("2.查找出某结点的父结点\n");
printf("3.求二叉树的高度\n");
printf("4.求二叉树的结点总数\n");
printf("0.结束\n");
printf("请选择编号(0—4):
");
scanf("%d",&n);
printf("\n");
switch(n){
case1:
printf("先序遍历此二叉树");
preorder(T);
printf("\n中序遍历此二叉树");
inorder(T);
printf("\n后序遍历此二叉树");
postorder(T);
printf("\n层次遍历此二叉树");
LevelOrder(T);
printf("\n\n");break;
case2:
printf("请输入结点数值(该数值为您已经建立的二叉树中除根结点以外的):
\n");
scanf("%s",&ch);
q=findNode(T,ch);
p=findparent(T,q);
if(p!
=NULL)
{printf("结点的父结点值为:
\n");
printf("%c\n\n",p->data);}
else
printf("该结点无父结点\n");break;
case3:
h=depth(T);
printf("该二叉树的高度为:
%d\n\n",h);break;
case4:
m=counter(T);
printf("该二叉树的结点总数为:
%d\n\n",m);break;
case0:
exit(0);
}
}
}
【测试结果】
实验1二叉树
实验内容:
建立二叉树用先序、中序、后序遍历此二叉树。
#include
#include
#defineNULL0
typedefstructBiTNode
{
chardata;
structBiTNode*lchild,*rchild;
}BinTNode,*BinTree;
voidCreateBinTree(BinTree*T)
{
charch;
scanf("\n%c",&ch);
if(ch=='0')*T=NULL;
else
{
*T=(BinTNode*)malloc(sizeof(BinTNode));
(*T)->data=ch;
CreateBinTree(&(*T)->lchild);
CreateBinTree(&(*T)->rchild);
}
}
voidPreOrderOut(BinTreeT)
{
if(T)
{PreOrderOut(T->lchild);
printf("%3c",T->data);
PreOrderOut(T->rchild);
}
}
voidInOrderOut(BinTreeT)
{
if(T)
{InOrderOut(T->lchild);
printf("%3c",T->data);
InOrderOut(T->rchild);
}
}
voidPostOrderOut(BinTreeT)
{
if(T)
{PostOrderOut(T->lchild);
printf("%3c",T->data);
PostOrderOut(T->rchild);
}
}
voidmain()
{
BinTreebt;
CreateBinTree(&bt);
printf("先序遍历:
");
PreOrderOut(bt);
printf("\n中序遍历:
");
InOrderOut(bt);
printf("\n后序遍历:
");
PostOrderOut(bt);
printf("\n");
}
测试结果:
实验2图
实验内容:
建立图,然后用广度优先和深度优先遍历输出。
#include
#include
#defineINFINITY32767
#defineMAX_VEX20//最大顶点个数
#defineQUEUE_SIZE(MAX_VEX+1)//队列长度
bool*visited;//访问标志数组
typedefstruct{
char*vexs;//顶点向量
intarcs[MAX_VEX][MAX_VEX];//邻接矩阵
intvexnum,arcnum;//图的当前顶点数和弧数
}Graph;
classQueue{
public:
voidInitQueue(){
base=(int*)malloc(QUEUE_SIZE*sizeof(int));
front=rear=0;
}
voidEnQueue(inte){
base[rear]=e;
rear=(rear+1)%QUEUE_SIZE;
}
voidDeQueue(int&e){
e=base[front];
front=(front+1)%QUEUE_SIZE;
}
public:
int*base;
intfront;
intrear;
};
intLocate(GraphG,charc){
for(inti=0;i if(G.vexs[i]==c)returni; return-1; } voidCreateUDN(Graph&G){ inti,j,w,s1,s2; chara,b,temp; printf("输入顶点数和弧数: "); scanf("%d%d",&G.vexnum,&G.arcnum); temp=getchar();//接收回车 G.vexs=(char*)malloc(G.vexnum*sizeof(char));//分配顶点数目 printf("输入%d个顶点.\n",G.vexnum); for(i=0;i printf("输入顶点%d: ",i); scanf("%c",&G.vexs[i]); temp=getchar();//接收回车 } for(i=0;i for(j=0;j G.arcs[i][j]=INFINITY; printf("输入%d条弧.\n",G.arcnum); for(i=0;i printf("输入弧%d: ",i); scanf("%c%c%d",&a,&b,&w);//输入一条边依附的顶点和权值 temp=getchar();//接收回车 s1=Locate(G,a); s2=Locate(G,b); G.arcs[s1][s2]=G.arcs[s2][s1]=w; } } intFirstVex(GraphG,intk){ if(k>=0&&k for(inti=0;i if(G.arcs[k][i]! =INFINITY)returni; } return-1; } intNextVex(GraphG,inti,intj){ if(i>=0&&i for(intk=j+1;k if(G.arcs[i][k]! =INFINITY)returnk; } return-1; } voidDFS(GraphG,intk){ inti; if(k==-1){//第一次执行DFS时,k为-1 for(i=0;i if(! visited[i])DFS(G,i);//对尚未访问的顶点调用DFS } else{ visited[k]=true; printf("%c",G.vexs[k]);//访问第k个顶点 for(i=FirstVex(G,k);i>=0;i=NextVex(G,k,i)) if(! visited[i])DFS(G,i);//对k的尚未访问的邻接顶点i递归调用DFS } } voidBFS(GraphG){ intk; QueueQ;//辅助队列Q Q.InitQueue(); for(inti=0;i if(! visited[i]){//i尚未访问 visited[i]=true; printf("%c",G.vexs[i]); Q.EnQueue(i);//i入列 while(Q.front! =Q.rear){ Q.DeQueue(k);//队头元素出列并置为k for(intw=FirstVex(G,k);w>=0;w=NextVex(G,k,w)) if(! visited[w]){//w为k的尚未访问的邻接顶点 visited[w]=true; printf("%c",G.vexs[w]); Q.EnQueue(w); } } } } voidmain(){ inti; GraphG; CreateUDN(G); visited=(bool*)malloc(G.vexnum*sizeof(bool)); printf("\n广度优先遍历: "); for(i=0;i visited[i]=false; DFS(G,-1); printf("\n深度优先遍历: "); for(i=0;i visited[i]=false; BFS(G); printf("\n程序结束.\n"); } 实验3线性表 实验内容: 合并两个升序有序表,新表的元素也升序排列。 #include #include #defineok1 #defineerror0 #defineLIST_INT_SIZE10 #defineelemtypeint typedefstruct{ elemtype*elem; intlength; intlistsize; }sqlist; intInit_sqlist(sqlist*la) { (*la).elem=(elemtype*)malloc(LIST_INT_SIZE*sizeof(elemtype)); if(! (*la).elem)returnerror; (*la).length=0; (*la).listsize=LIST_INT_SIZE; returnok; } voidmergelist_sq(sqlistla,sqlistlb,sqlist&lc); voidmain() { inti;sqlistla,lb,lc; Init_sqlist(&la); Init_sqlist(&lb); for(i=0;i<5;i++) scanf("%d",&la.elem[i]); la.length=5; for(i=0;i<5;i++) scanf("%d",&lb.elem[i]); lb.length=5; mergelist_sq(la,lb,lc); } voidmergelist_sq(sqlistla,sqlistlb,sqlist&lc) { int*pa,*pb,*pc,*pa_last,*pb_last,i; pa=la.elem;pb=lb.elem; lc.listsize=la.length+lb.length; pc=lc.elem=(elemtype*)malloc(lc.listsize*sizeof(elemtype)); pa_last=la.elem+la.length-1; pb_last=lb.elem+lb.length-1; while(pa<=pa_last&&pb<=pb_last){ if(*pa<=*pb)*pc++=*pa++; else*pc++=*pb++;} while(pa<=pa_last)*pc++=*pa++; while(pb<=pb_last)*pc++=*pb++; for(i=0;i printf("%d,",lc.elem[i]); printf("\n"); } 测试结果: 实验4查找 实验内容: 输入1245678912131415161819个升序排列的已知数,用折半查找查找关键码为8和13的位置。 #include #defineN15 main() {inti,number,top,bott,mid,loca,a[N],flag=1,sign=1; charc; printf("Enterdata: \n"); scanf("%d",&a[0]); i=1; while(i {scanf("%d",&a[i]); if(a[i]>a[i-1]) i++; else printf("Enterthisdataagain: "); } printf("\n"); for(i=0;i printf("%4d",a[i]); printf("\n"); flag=1; while(flag) {printf("Inputnumbertolookfor: "); scanf("%d",&number); loca=0; top=0; bott=N-1; if((numbera[N-1])) loca=-1; sign=1; while((sign==1)&&(top<=bott)) {mid=(bott+top)/2; if(number==a[mid]) {loca=mid; printf("Find%d,itspositionis%d\n",number,loca+1); sign=0;}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 报告