电大数据结构实验报告.docx

上传人:b****7 文档编号:24005700 上传时间:2023-05-23 格式:DOCX 页数:35 大小:122.46KB
下载 相关 举报
电大数据结构实验报告.docx_第1页
第1页 / 共35页
电大数据结构实验报告.docx_第2页
第2页 / 共35页
电大数据结构实验报告.docx_第3页
第3页 / 共35页
电大数据结构实验报告.docx_第4页
第4页 / 共35页
电大数据结构实验报告.docx_第5页
第5页 / 共35页
点击查看更多>>
下载资源
资源描述

电大数据结构实验报告.docx

《电大数据结构实验报告.docx》由会员分享,可在线阅读,更多相关《电大数据结构实验报告.docx(35页珍藏版)》请在冰豆网上搜索。

电大数据结构实验报告.docx

电大数据结构实验报告

实验一单链表的插入,删除,初始化

一、实验环境

Windowsxp操作系统TurboC2.0

二、实验目的

通过对链表的实际操作,巩固链表的基本知识,关键是掌握指针的操作。

三、实验内容

生成一个头指针是head的单链表,然后对该链表进行插入和删除运算。

四、实验要求

1编写程序生成一个单链表;

2插入、删除用子程序实现;

3输出每次运算前后的链表,进行比较与分析。

五、实验步骤

#include

#include

#defineNULL0

typedefstructLNode

{intdata;

structLNode*next;

}LNode,*LinkList;

//假设下面的单链表均为带头结点。

voidCreatLinkList(LinkList&head,intj)

{//建立一个单链表L;,数据为整数,数据由键盘随机输入。

inti;

LinkListp,q;

head=(LinkList)malloc(sizeof(LNode));

head->next=NULL;

q=head;

printf("在单链表内输入整数:

\n");

for(i=0;i

{p=(LinkList)malloc(sizeof(LNode));

scanf("%d",&p->data);

p->next=q->next;

q->next=p;

q=p;

}

}

intPrintLinkList(LinkList&L)

{//输出单链表L的数据元素

LNode*p;

p=L->next;

if(L->next==NULL)

{

printf("链表没有元素!

\n");

return0;

}

printf("单链表的数据元素为:

");

while(p)

{

printf("%d",p->data);

p=p->next;

}

printf("\n");

//return1;

}

voidLinkListLengh(LinkList&L)

{//计算单链表L的数据元素个数。

inti=0;

LinkListp;

p=L->next;

while(p)

{

i++;

p=p->next;

}

printf("单链表的数据元素个数为:

%d",i);

printf("\n");

}

intInsertLinkList(LinkList&L,inti,intx)

{//在单链表L的第I个元素前插入一个数据元素X。

LinkListp,s;

intj=0;

p=L;

while(p&&j

{

p=p->next;

++j;

}

if(!

p||j>i-1)

{

printf("插入元素的位置不合理!

");

return0;

}

s=(LinkList)malloc(sizeof(LNode));

s->data=x;

s->next=p->next;

p->next=s;

return1;

}

intDeleteLinkList(LinkList&L,inti)

{//删除单链表L的第I个数据元素。

LinkListp,q;

intj=0;

p=L;

while(p->next&&j

{

p=p->next;

++j;

}

if(!

(p->next)||j>i-1)

{

printf("删除元素的位置不合理!

");

return0;

}

q=p->next;

p->next=q->next;

i=q->data;

free(q);

return1;

}

voidClearLinkList(LinkList&L)

{//将单链表L置为空表。

L->next=NULL;

}

voidDestroyLinkList(LinkList&L)

{//销毁单链表L。

LinkListp,q;

p=L->next;

while(L->next!

=NULL)

{

q=p->next;

L->next=q;

free(p);

p=q;

}

free(L);

printf("链表已经被销毁!

\n");

}

voidmain()

{//调用上面的各函数,运行并检验程序是否正确。

LinkListL;

inti,j,x;

printf("---------------------------------------");

printf("\n");

printf("《单链表实验,按提示操作》");

printf("\n");

printf("---------------------------------------");

printf("\n");

printf("输入的元素的个数:

");

scanf("%d",&j);

CreatLinkList(L,j);

LinkListLengh(L);

PrintLinkList(L);

printf("在第几个元素前插入:

");

scanf("%d",&i);

printf("输入插入的元素:

");

scanf("%d",&x);

InsertLinkList(L,i,x);

LinkListLengh(L);

PrintLinkList(L);

printf("输入删除元素的位置:

");

scanf("%d",&i);;

DeleteLinkList(L,i);

LinkListLengh(L);

PrintLinkList(L);

ClearLinkList(L);

printf("清空链表后:

\n");

LinkListLengh(L);

PrintLinkList(L);

DestroyLinkList(L);

}

六、实验结果

实验二栈及其应用

一、实验环境

Windowsxp操作系统TurboC2.0

二、实验目的

通过一个实际问题、加深对栈的理解;掌握进栈、出栈、清栈运算的实现方法。

三、实验内容

十进制转换成八进制

四、实验要求

进栈、出栈和清栈的运算以子程序的方式实现。

五、实验步骤

#include

#include"malloc.h"

#include"stdlib.h"

#definestack_init_size100

#definestackincrement10

#defineN8

typedefstruct

{

int*base;

int*top;

intstacksize;

}sqstack;

intinitstack(sqstack&s)

{

s.base=(int*)malloc(stack_init_size*sizeof(int));

if(!

s.base)exit(0);

s.top=s.base;

s.stacksize=stack_init_size;

return0;

}

intgettop(sqstacks,int&e)

{

if(s.top==s.base)

return1;

e=*(s.top-1);

return0;

}

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)return1;

s.top=s.base+s.stacksize;

s.stacksize+=stackincrement;

}

*s.top++=e;

return0;

}

intpop(sqstack&s,int&e)

{

if(s.top==s.base)return1;

e=*--s.top;

return0;

}

intstackempty(sqstacks)

{

if(s.top==s.base)

return1;

return0;

}

intdestroystack(sqstack&s)

{

free(s.base);

s.base=s.top=0;

return0;

}

voidmain()

{

intn,e;

sqstacks;

initstack(s);

cout<<"请输入一个正整数:

"<

cin>>n;

while(n)

{

push(s,n%8);

n/=N;

}

cout<<"转换出的八进制为"<

while(!

stackempty(s))

{

pop(s,e);

cout<

}

cout<

destroystack(s);

}

六实验结果:

 

实验三二叉树的建立及输出

一、实验环境

Windowsxp操作系统TurboC2.0

二、实验目的

熟悉二叉链表表示的二叉树结构及其递归遍历,掌握建立二叉链表要领,深入理解递归遍历二叉链表的执行路径。

三、实验内容

(1)建立一颗二叉链表表示的二叉树;

(2)对其进行前序,中序,后序输出。

四、实验要求

先将二叉树通过加入虚节点的方式使其完全化,然后按层将其输入。

可以用二叉树中不会出现字符表示虚节点例如@,另一二叉树中不会出现的字符表示输入序列结束例如#。

如下二叉树须输入序列a@b@@@c#。

或以广义表的形式输入二叉树的节点。

按先序,中序,后序序列将其遍历输出。

五、实验步骤

//A.HeaderFilesSourceFilesbitree.cpp

#include"bitree.h"

intmain(intargc,char*argv[])

{

intarray[]={5,6,3,7,67,1,24,8,21,16,78,9};

Treetr(array,sizeof(array)/sizeof(array[0]));

tr.traverse();

return0;

}

//B.HeaderFilesbitree.h

#include

#include

//heredelete#include

usingnamespacestd;

typedefinttelemtype;

structbitnode//changetotypedefstructbitnodeanditwillbe

//'typedef':

ignoredonleftof'structbitnode'whennovariableisdeclaredatlastitwillbeok

{

bitnode*lchild;

bitnode*rchild;

telemtypedata;

bitnode(inte=0,bitnode*left=NULL,bitnode*right=NULL)

{

data=e;

lchild=left;

rchild=right;

}

};

classTree

{

public:

Tree()

{

root=NULL;

}

Tree(intarray[],intsize);

~Tree();

voidtraverse();

voidpostTraverse();

voidrecur_postTraverse(bitnode*cur);

voidpreTraverse();

voidrecur_preTraverse(bitnode*cur);

voidinTraverse();

voidrecur_inTraverse(bitnode*cur);

private:

Tree(constTree&t);

Tree&operator=(constTree&t);

bitnode*createTree(intarray[],intsize);

voiddestroyTree(bitnode*cur);

private:

bitnode*root;

};

Tree:

:

Tree(intarray[],intsize)

{

if((array==NULL)||(size<=0))

root=NULL;

else

root=createTree(array,size);

}

//createatree

bitnode*Tree:

:

createTree(intarray[],intsize)

{

if((array==NULL)||(size<=0))

returnNULL;

intmid=size/2;

bitnode*cur=newbitnode(array[mid]);

cur->lchild=createTree(array,mid);

cur->rchild=createTree(array+mid+1,size-mid-1);

returncur;

}

Tree:

:

~Tree()

{

destroyTree(root);

}

voidTree:

:

destroyTree(bitnode*cur)

{

if(cur!

=NULL)

{

destroyTree(cur->lchild);

destroyTree(cur->rchild);

deletecur;

}

}

 

//后序递归遍历

voidTree:

:

recur_postTraverse(bitnode*cur)

{

if(cur!

=NULL)

{

recur_postTraverse(cur->lchild);

recur_postTraverse(cur->rchild);

cout<data<<"";

}

}

//先序递归遍历

voidTree:

:

recur_preTraverse(bitnode*cur)

{

if(cur!

=NULL)

{

cout<data<<"";

recur_preTraverse(cur->lchild);

recur_preTraverse(cur->rchild);

}

}

//中序递归遍历

voidTree:

:

recur_inTraverse(bitnode*cur)

{

if(cur!

=NULL)

{

recur_inTraverse(cur->lchild);

cout<data<<"";

recur_inTraverse(cur->rchild);

}

}

//后序非递归遍历

voidTree:

:

postTraverse()

{

stacktreeStack;

bitnode*pre,*cur;

cur=root;

pre=NULL;

if(cur!

=NULL)

treeStack.push(cur);

while(!

treeStack.empty())

{

cur=treeStack.top();

if(((cur->lchild==NULL)&&(cur->rchild==NULL))||//没有孩子结点或者

((pre!

=NULL)&&((pre==cur->lchild)||(pre==cur->rchild))))//孩子遍历过了

{

treeStack.pop();

cout<data<<"";

pre=cur;

}

else

{

if(cur->rchild!

=NULL)

treeStack.push(cur->rchild);

if(cur->lchild!

=NULL)

treeStack.push(cur->lchild);

}

}

}

//中序非递归遍历

voidTree:

:

inTraverse()

{

stacktreeStack;

bitnode*cur;//thefirstisbitnode*pre,*cur;delete*preisok;

cur=root;

if(cur!

=NULL)

treeStack.push(cur);

while(!

treeStack.empty())

{

cur=treeStack.top();

treeStack.pop();

if(cur==NULL)

continue;

if((cur->lchild==NULL)||//没有左孩子或者

((!

treeStack.empty())&&(treeStack.top()==cur->rchild)))//右孩子已经入过栈

cout<data<<"";

else

{

treeStack.push(cur->rchild);

treeStack.push(cur);

if(cur->lchild!

=NULL)

treeStack.push(cur->lchild);

}

}

}

//先序非递归遍历

voidTree:

:

preTraverse()

{

stacktreeStack;

bitnode*cur;

cur=root;

if(cur!

=NULL)

treeStack.push(cur);

while(!

treeStack.empty())

{

cur=treeStack.top();

treeStack.pop();

cout<data<<"";

if(cur->rchild!

=NULL)

treeStack.push(cur->rchild);

if(cur->lchild!

=NULL)

treeStack.push(cur->lchild);

}

}

 

voidTree:

:

traverse()

{

cout<<"递归前序遍历二叉树"<

recur_preTraverse(root);

cout<

cout<<"非递归前序遍历二叉树"<

preTraverse();

cout<

cout<<"递归中序遍历二叉树"<

recur_inTraverse(root);

cout<

cout<<"非递归中序遍历二叉树"<

inTraverse();

cout<

cout<<"递归后序遍历二叉树"<

recur_postTraverse(root);

cout<

cout<<"非递归后序遍历二叉树"<

postTraverse();

cout<

}

六、实验结果

 

实验四图及其遍历

一、实验环境

Windowsxp操作系统TurboC2.0

二、实验目的

(1)熟悉图的邻接矩阵及邻接表的表示方法;

(2)掌握建立图的邻接矩阵算法,并由邻接矩阵转化为邻接表;

(3)熟悉对图遍历算法;

(4)熟悉队列这种基本的数据结构。

三、实验内容

(1)建立图的邻接表及邻接矩阵;

(2)对其进行深度优先及广度优先遍历。

四、实验要求

将图以邻接矩阵的存储形式存入计算机,然后输出其深度优先及广度优先序列。

五、实验步骤

#include

//#include

#defineINFINITY32767

#defineMAX_VEX20//最大顶点个数

#defineQUEUE_SIZE(MAX_VEX+1)//队列长度

usingnamespacestd;

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;

};

//图G中查找元素c的位置

intLocate(GraphG,charc){

for(inti=0;i

if(G.vexs[i]==c)returni;

return-1;

}

//创建无向网

voidCreateUDN(Graph&G){

inti,j,w,s1,

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

当前位置:首页 > 表格模板 > 调查报告

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

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