DATASTRUCTWord格式.docx

上传人:b****4 文档编号:16681575 上传时间:2022-11-25 格式:DOCX 页数:23 大小:108.53KB
下载 相关 举报
DATASTRUCTWord格式.docx_第1页
第1页 / 共23页
DATASTRUCTWord格式.docx_第2页
第2页 / 共23页
DATASTRUCTWord格式.docx_第3页
第3页 / 共23页
DATASTRUCTWord格式.docx_第4页
第4页 / 共23页
DATASTRUCTWord格式.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

DATASTRUCTWord格式.docx

《DATASTRUCTWord格式.docx》由会员分享,可在线阅读,更多相关《DATASTRUCTWord格式.docx(23页珍藏版)》请在冰豆网上搜索。

DATASTRUCTWord格式.docx

软件:

配有Windows98/2000/XP操作系统,安装VisualC++。

5、实验时间:

10学时

6、该文档的文件名不要修改,存入<

学号>

<

姓名>

命名的文件夹中

7、该表中的数据只需填空,已有内容不要修改

实验结果(运行结果界面及源程序,运行结果界面放在前面):

#include"

stdafx.h"

iostream.h"

string.h"

enumStatus{OK=1,ERROR=0};

typedefstruct

{

charname[8];

intnumber;

}team;

structBinaryTreeNode

teamdata;

BinaryTreeNode*LChild;

BinaryTreeNode*RChild;

};

structSType

BinaryTreeNode*ptr;

boolB;

structQType

BinaryTreeNode*qtr;

structStack

SType*element;

inttop;

intMaxSize;

structQueue

QType*element;

intfront;

intrear;

voidCreatStack(Stack&

S,int&

MaxStackSize)

{//构造一个最大容量为MaxStackSize的堆栈S

S.MaxSize=MaxStackSize;

S.element=newSType[S.MaxSize];

S.top=-1;

}

boolIsEmpty(Stack&

S)

{//判断堆栈S是否为空

if(S.top==-1)returntrue;

returnfalse;

boolIsFull(Stack&

{//判断堆栈S是否为满

if(S.top>

=S.MaxSize-1)returntrue;

StatusPush(Stack&

S,SType&

x)

{//x进S栈,返回进栈后的状态值

if(IsFull(S))returnERROR;

S.top++;

S.element[S.top]=x;

returnOK;

StatusPop(Stack&

{//将S栈顶的值取至x中,返回出栈后的状态值

if(IsEmpty(S))returnERROR;

x=S.element[S.top];

S.top--;

voidCreatQueue(Queue&

Q,int&

MaxQueueSize)

{//构造一个最大容量为MaxQueueSize的队列Q

Q.MaxSize=MaxQueueSize;

Q.element=newQType[Q.MaxSize+1];

Q.front=0;

Q.rear=0;

boolIsEmpty(Queue&

Q)

{//判断队列Q是否为空

if(Q.front==Q.rear)returntrue;

boolIsFull(Queue&

{//判断队列Q是否为满

if(Q.front==(Q.rear+1)%(Q.MaxSize+1))returntrue;

StatusEnqueue(Queue&

Q,QType&

{//x进Q队列,返回进队后的状态值

if(IsFull(Q))returnERROR;

Q.element[Q.rear]=x;

Q.rear=(Q.rear+1)%(Q.MaxSize+1);

StatusDequeue(Queue&

{//将Q队列队头的值取至x中,返回出队后的状态值

if(IsEmpty(Q))returnERROR;

x=Q.element[Q.front];

Q.front=(Q.front+1)%(Q.MaxSize+1);

voidPreOrder(BinaryTreeNode*BT)

{//二叉树的前序遍历递归算法

if(BT)

{

cout<

<

BT->

data.name<

"

:

data.number<

"

;

//访问二叉树的结点

PreOrder(BT->

LChild);

RChild);

}

voidInOrder(BinaryTreeNode*BT)

{//二叉树的中序遍历递归算法

InOrder(BT->

voidPostOrder(BinaryTreeNode*BT)

{//二叉树的后序遍历递归算法

PostOrder(BT->

voidPreOrderN(BinaryTreeNode*BT)

{//二叉树的前序遍历非递归算法

StackS;

STypeT;

T.ptr=BT;

intMaxStackSize=50;

CreatStack(S,MaxStackSize);

while(T.ptr||!

IsEmpty(S))

if(T.ptr)

{

cout<

T.ptr->

//访问"

根"

结点

Push(S,T);

//根结点指针进栈,以后回溯时再退栈

T.ptr=T.ptr->

LChild;

//指针指向访问过的"

结点左子树

}

else//左子树为空时,利用堆栈回溯

if(!

{

Pop(S,T);

//从堆栈中弹出回溯结点指针(该结点已访问过)

T.ptr=T.ptr->

RChild;

//指针指向回溯结点的右子树

}

delete[]S.element;

voidInOrderN(BinaryTreeNode*BT)

{//二叉树的中序遍历非递归算法

do

while(T.ptr)

{//找最左子树

//"

结点(未访问)指针进栈,以后回溯时再退栈

//指针指向"

if(!

{//左子树为空时,利用堆栈回溯

Pop(S,T);

//从堆栈中弹出回溯结点指针(该结点未访问过)

while((T.ptr)||!

IsEmpty(S));

voidPostOrderN(BinaryTreeNode*BT)

{//二叉树的后序遍历非递归算法

BinaryTreeNode*p=BT;

STypetemp;

while((p)||!

if(p)

temp.B=false;

//准备进栈的结点进栈标志设为第一次进栈

temp.ptr=p;

Push(S,temp);

//根结点(未访问)指针及标志进栈,以后回溯时再退栈

p=p->

//指针指向该"

else

{//左子树为空时,利用堆栈回溯

Pop(S,temp);

//从堆栈中弹出回溯结点指针及标志(该结点未访问过)

p=temp.ptr;

//p指向退栈结点,否则p的值是空

if(temp.B)

{

cout<

p->

//访问该结点

p=NULL;

//将p设为空的目的是为强制退栈作准备

}

else

temp.B=true;

//改变进栈标志,准备重新进栈

Push(S,temp);

p=p->

的右子树

voidLevelOrderTL(BinaryTreeNode*BT)

{//从左至右,从上至下按层次遍历一棵二叉树(Top_Left)

QueueQ;

QTypeD;

D.qtr=BT;

BinaryTreeNode*q;

intMaxQueueSize=50;

CreatQueue(Q,MaxQueueSize);

//产生一个空队列,这一过程函数可以不在这里进行

while(D.qtr)

D.qtr->

q=D.qtr;

if(D.qtr->

LChild)

D.qtr=D.qtr->

Enqueue(Q,D);

//左子树进队

D.qtr=q;

RChild)

//右子树进队

Dequeue(Q,D))return;

//出队返回状码ERROR时结束(队空)

delete[]Q.element;

voidLevelOrderTR(BinaryTreeNode*BT)

{//从右至左,从上至下按层次遍历一棵二叉树(Top_Right)

BinaryTreeNode*MakeNode(team&

{//构造结点

ptr=newBinaryTreeNode;

if(!

ptr)returnNULL;

ptr->

data=x;

LChild=NULL;

RChild=NULL;

returnptr;

voidMakeBinaryTree(BinaryTreeNode*root,BinaryTreeNode*left,BinaryTreeNode*right)

{//联接root,left,right所指的结点指针为二叉树

root->

LChild=left;

RChild=right;

intBinaryHeight(BinaryTreeNode*BT)

{//返回二叉树的高度

BT)return0;

intHighL=BinaryHeight(BT->

intHighR=BinaryHeight(BT->

if(HighL>

HighR)

return++HighL;

else

return++HighR;

voidBinaryDelete(BinaryTreeNode*BT)

{//二叉树的删除算法

BinaryDelete(BT->

deleteBT;

//这里的delete是系统过程

voidmain()

BinaryTreeNode*p[11];

intm=2;

teamx[11];

cout<

********TheteamofInformationmanagementandinformationsystem0904********\n"

Pleaseinputtheinformationoftheteam:

\n"

/*for(inti=1;

i<

=10;

i++)//输入、构造结点

Player"

\nName:

cin>

>

x[i].name;

Number:

x[i].number;

p[i]=MakeNode(x[i]);

}*/

chara[11][11]={"

"

ding"

cai"

liu"

xuan"

wu"

zhu"

yang"

jiang"

liao"

zhou"

intb[11]={0,14,24,3,11,10,5,1,8,17,21};

for(inti=1;

i++)

strcpy(x[i].name,a[i]);

x[i].number=b[i];

for(i=1;

=5;

i++)//构造二叉树

if(i==5)

p[i]->

LChild=p[2*i];

}

else

MakeBinaryTree(p[i],p[2*i],p[2*i+1]);

//输出二叉树的结构

Thebinarytreeis:

____________"

x[1].name<

x[1].number<

______________"

endl;

_______"

x[2].name<

x[2].number<

________"

x[3].name<

x[3].number<

___"

_"

x[4].name<

x[4].number<

__"

x[5].name<

x[5].number<

<

x[6].name<

x[6].number<

x[7].name<

x[7].number<

x[8].name<

x[8].number<

x[9].name<

x[9].number

x[10].name<

x[10].number<

//前序递归遍历

Theresultofpreorderrecursivetraversal:

PreOrder(p[1]);

endl<

//中序递归遍历

cout<

Theresultofinorderrecursivetraversal:

InOrder(p[1]);

//后序递归遍历

Theresultofpostorderrecursivetraversal:

PostOrder(p[1]);

//前序非递归遍历

Theresultofpretordernon-recursivetraversal:

PreOrderN(p[1]);

//中序非递归遍历

Theresultofinordernon-recursivetraversal:

InOrderN(p[1]);

//后序非递归遍历

Theresultofpostordernon-recursivetraversal:

PostOrderN(p[1]);

//层次遍历从上至下、从左至右

Theresultofleveltraversalfromuptodownfromlefttoright:

LevelOrderTL(p[1]);

//层次遍历从上至下、从右至左

Theresultofleveltraversalfromuptodownfromrighttoleft:

LevelOrderTR(p[1]);

//二叉树高度

TheheightoftheBinarytreeis:

BinaryHeight(p[1])<

//删除

BinaryDelete(p[1]);

实验四堆栈及队列的应用

一、【实验目的】

1、掌握链式堆栈的类型定义方法。

2、掌握链式堆栈上实现的几种基本操作。

3、掌握链式队列的类型定义方法。

4、掌握链式队列上实现的几种基本操作。

二、【实验内容】

1、编程序判断一个字符序列是否是回文,要求采用链式队列和链式堆栈。

(可参照书本例3-3)

(以下是程序部分代码,请调试并补充使之正确运行。

LinStack.h

typedefstructsnode

DataTypedata;

structsnode*next;

}LSNode;

voidStackInitiate(LSNode**head)

/*初始化带头结点链式堆栈*/

if((*head=(LSNode*)malloc(sizeof(LSNode)))==NULL)

Printf(“没有空间申请\n”);

Return;

(*head)->

next=NULL;

intStackNotEmpty(LSNode*head)

/*判堆栈是否非空,非空返回1;

空返回0*/

if(head->

next==NULL)return0;

elsereturn1;

intStackPush(LSNode*head,DataTypex)

/*把数据元素x插入链式堆栈head的栈顶作为新的栈顶*/

LSNode*p;

if((p=(LSNode*)malloc(sizeof(LSNode)))==NULL)

printf("

内存空间不足无法插入!

\n"

);

return0;

data=x;

next=head->

next;

/*新结点链入栈顶*/

head->

next=p;

/*新结点成为新的栈顶*/

return1;

intStackPop(LSNode*head,DataType*d)

/*出栈并把栈顶元素由参数d带回*/

LSNode*p=head->

if(p==NULL)

堆栈已空出错!

next=p->

/*删除原栈顶结点*/

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 财会金融考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1