科技大学数据结构试验报告附录含代码Word下载.docx
《科技大学数据结构试验报告附录含代码Word下载.docx》由会员分享,可在线阅读,更多相关《科技大学数据结构试验报告附录含代码Word下载.docx(21页珍藏版)》请在冰豆网上搜索。
通过做第四题,对于Huffman树有了更加深刻的体会,同时练习也使得对课本知识进行实践,有助于更好的理解Huffman树的算法。
五、
设英文句子:
“everyoneroundyoucanhearyouwhenyouspeak.”
(1)依次读入句中各单词,构造一棵二叉排序树;
(2)按LDR遍历此二叉排序树。
LDR:
caneveryonehearroundspeakwhenyou(有序)
本题目是有关二叉树的建立和中序遍历的,二叉树作为数据存储一个很重要的结构,它的建立也是很重要的。
本题目代码设计上采用课本上的对于二叉树建立的方法,将所给单词以二叉树形式建立并存储,然后中序遍历的到字典顺序。
程序调试完成后,给出单词串everyoneroundyoucanhearyouwhenyouspeak,运行代码得出中序遍历结果如图。
通过做第五题,练习运用二叉树模型解决了一些实际问题如现实中字典的编排问题,在熟悉算法的基础上,同时得出结论,好的算法可以应用与实际生活生产,使之更为便捷。
附录程序代码
实验一:
#include"
stdio.h"
malloc.h"
typedefstructnode
{
intdata;
structnode*next;
}list,*List;
ListCreatlist()//建立链表函数
ListH,p,r;
//H为表头,r为新节点,p为表尾节点指针
H=(List)malloc(sizeof(list));
//建立头节点
r=H;
p=(List)malloc(sizeof(list));
//申请新节点
while(scanf("
%d"
p)&
&
p->
data!
=0)//输入数据,直到为零(结束标志)
{
r->
next=p;
//新节点链入表尾
r=p;
p=(List)malloc(sizeof(list));
}
r->
next=NULL;
//将尾节点的指针域置空
returnH;
//返回已创建的头节点
}
ListAdjmax(ListH)//比较相邻两数之和
{//返回相邻两数之和最大的第一个数指针
Listp,r,q;
intsum=0;
p=H->
next;
if(H->
next==NULL)//判断是否为空
printf("
EmptyList!
"
);
q=(List)malloc(sizeof(list));
q->
data=0;
}
while(p!
=NULL)//比较相邻两数之和
r=p->
next;
if(p&
r)
if(r->
data+p->
data>
sum)
{
q=p;
sum=r->
data+p->
data;
}//不断赋给sum新的最大值
else;
p=p->
returnq;
intmain()
charch;
printf("
///请输入整形数据,以空格隔开,0结束。
///\n"
Ready?
\nY/N(enter'
y'
or'
Y'
tocontinue)\n"
%c"
&
ch)&
(ch=='
||ch=='
))
ListH,pmax;
H=Creatlist();
pmax=Adjmax(H);
相邻两数之和最大的第一个数为:
%d\nContinue?
Y/N"
pmax->
data);
free(H);
scanf("
ch);
return0;
实验二:
#include<
stdio.h>
malloc.h>
conio.h>
typedefstructnode//栈节点类型
chardata;
//存储一个栈元素
//后继指针
}snode,*slink;
intEmptystack(slinkS)//检测栈空
if(S==NULL)return
(1);
elsereturn(0);
charPop(slink*top)//出栈
chare;
slinkp;
if(Emptystack(*top))return(-1);
//栈空返回
else
e=(*top)->
data;
//取栈顶元素
p=*top;
*top=(*top)->
//重置栈顶指针
free(p);
return(e);
voidPush(slink*top,chare)//进栈
p=(slink)malloc(sizeof(snode));
//生成进栈p节点
p->
data=e;
//存入元素e
next=*top;
//p节点作为新的栈顶链入
*top=p;
voidClearstack(slink*top)//置空栈
while(*top!
=NULL)
p=(*top)->
Pop(top);
//依次弹出节点直到栈空
*top=p;
*top=NULL;
charGetstop(slinkS)//取栈顶
if(S!
=NULL)return(S->
data);
return(0);
//符号优先级比较
intPrecede(charx,chary)//比较x是否"
大于"
y
switch(x)
{
case'
('
:
x=0;
break;
+'
-'
x=1;
*'
/'
x=2;
default:
x=-1;
switch(y)
y=1;
y=2;
y=3;
y=100;
if(x>
=y)return
(1);
//中后序转换
voidmid_post(charpost[],charmid[])//中缀表达式mid到后缀表达式post的转换的算法
inti=0,j=0;
charx;
slinkS=NULL;
//置空栈
Push(&
S,'
#'
//结束符入栈
do
x=mid[i++];
//扫描当前表达式分量x
switch(x)
{case'
{while(!
Emptystack(S))
post[j++]=Pop(&
S);
}break;
case'
)'
{while(Getstop(S)!
='
)
//反复出栈直至遇到'
Pop(&
//退掉'
{while(Precede(Getstop(S),x))//栈顶运算符(Q1)与x比较
//Q1>
=x时,输出栈顶符并退栈
Push(&
S,x);
//Q1<
x时x进栈
default:
post[j++]=x;
//操作数直接输出
}
}while(x!
post[j]='
\0'
;
//后缀表达式求值
intpostcount(charpost[])//后缀表达式post求值的算法
inti=0;
floatz,a,b;
//置栈空
while(post[i]!
{x=post[i];
//扫描每一个字符送x
{case'
b=Pop(&
a=Pop(&
z=a+b;
Push(&
S,z);
case'
z=a-b;
z=a*b;