数据结构实验指导书.docx

上传人:b****3 文档编号:6081626 上传时间:2023-05-09 格式:DOCX 页数:45 大小:98.55KB
下载 相关 举报
数据结构实验指导书.docx_第1页
第1页 / 共45页
数据结构实验指导书.docx_第2页
第2页 / 共45页
数据结构实验指导书.docx_第3页
第3页 / 共45页
数据结构实验指导书.docx_第4页
第4页 / 共45页
数据结构实验指导书.docx_第5页
第5页 / 共45页
数据结构实验指导书.docx_第6页
第6页 / 共45页
数据结构实验指导书.docx_第7页
第7页 / 共45页
数据结构实验指导书.docx_第8页
第8页 / 共45页
数据结构实验指导书.docx_第9页
第9页 / 共45页
数据结构实验指导书.docx_第10页
第10页 / 共45页
数据结构实验指导书.docx_第11页
第11页 / 共45页
数据结构实验指导书.docx_第12页
第12页 / 共45页
数据结构实验指导书.docx_第13页
第13页 / 共45页
数据结构实验指导书.docx_第14页
第14页 / 共45页
数据结构实验指导书.docx_第15页
第15页 / 共45页
数据结构实验指导书.docx_第16页
第16页 / 共45页
数据结构实验指导书.docx_第17页
第17页 / 共45页
数据结构实验指导书.docx_第18页
第18页 / 共45页
数据结构实验指导书.docx_第19页
第19页 / 共45页
数据结构实验指导书.docx_第20页
第20页 / 共45页
亲,该文档总共45页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

数据结构实验指导书.docx

《数据结构实验指导书.docx》由会员分享,可在线阅读,更多相关《数据结构实验指导书.docx(45页珍藏版)》请在冰点文库上搜索。

数据结构实验指导书.docx

数据结构实验指导书

《数据结构》实验指导书

(适用于计算机科学与技术、软件工程专业)

 

编写人:

李军

 

信息科学与工程学院

软件工程教研室

2012-8

 

前言

《数据结构》是计算机科学与技术、网络工程等专业的专业基础必修课,主要介绍如何合理地组织数据、有效地存储和处理数据,正确地设计算法以及对算法进行分析和评价。

本课程的学习应使学生深刻地理解数据结构的逻辑结构和物理结构的基本概念及有关算法,培养学生基本的、良好的程序设计技能以及针对具体问题,选择适当的数据结构,设计出有效算法的能力。

《数据结构》是一门理论和实践相结合的课程,它在整个计算机专业教学体系中处于举足轻重的地位,是计算机科学的算法理论基础和软件设计的技术基础,其上机实验的目的主要是编程实现数据结构各章的主要算法,训练学生实际动手进行程序设计和程序调试的能力,加深对数据结构相关概念和算法的理解。

实验一、单链表的基本操作

一、实验目的

1、掌握线性链表的操作特点,即指针是逻辑关系的映像。

2、掌握动态产生单链表的方法。

3、熟练掌握单链表的插入、删除操作特点,即指针赋值的先后次序。

4、熟练掌握单链表的取元素操作

二、实验内容

1、定义单链表类型并动态创建单链表

2、实现线性表链式存储结构下元素的插入操作

3、实现线性表链式存储结构下元素的删除操作

4、实现线性表链式存储结构下取元素操作

三、实验环境

TC或VC++

四、实验步骤

1、单链表的存储定义

typedefstructLNode{

ElemTypedata;//数据域

structLNode*next;//指针域

}LNode,*LinkList;

2、从键盘上依次输入21、18、30、75、42、56,逆序创建单链表,并输出单链表中的各元素值。

逆序创建单链表算法如下:

voidCreateList_L(LinkList&L,intn){

//逆序输入n个数据元素,建立带头结点的单链表

L=(LinkList)malloc(sizeof(Lnode));

L->next=NULL;//建立带头结点的单链表

for(i=n;i>0;--i){

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

scanf(&p->data);//输入元素值

p->next=L->next;L->next=p;//插入

}

}//CreateList_L

3、分别在单链表的第3个位置和第9个位置插入67和10,给出插入成功或失败的信息,并输出单链表中的各元素值。

单链表的插入操作算法如下:

StatusListInsert_L(ListLInk&L,inti,ElemTypee){

//在带头结点的单链表L中第i个位置前插入元素

p=L;j=0;

while(p&&j

if(!

p||j>i-1)returnERROR;

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

s→data=e;s→next=p→next;

p→next=s;

returnOK;

}//LinkList_L

}

4、删除单链表中的第6个数据元素和第8个数据元素,给出删除成功或失败的信息,并输出单链表中的各元素值。

单链表的删除操作如下:

StatusListDelete_L(LinkListL,inti,ElemType&e){

//删除以L为头指针(带头结点)的单链表中第i个结点

p=L;j=0;

while(p->next&&jnext;++j;}

//寻找第i个结点,并令p指向其前趋

if(!

(p->next)||j>i-1)returnERROR;//删除位置不合理

q=p->next;p->next=q->next;//删除并释放结点

e=q->data;free(q);

returnOK;

}//ListDelete_L

5、取单链表中的第5个数据元素和第7个数据元素

StatusGetElem_L(LinkListL,inti,ElemType&e){

//L为带头结点的单链表的头指针。

//当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR

p=L→next;j=1;//初始化

while(p&&j

p=p→next;++j;

}

if(!

p||j>i)returnERROR;//第i个元素不存在

elsee=p→data;   //取第i个元素

returnOK;

}//GetElem_L

五、问题讨论

1、单链表具有什么优缺点?

2、单链表的定义与顺序表的定义有什么区别?

3、逆序创建单链表有什么好处?

4、为什么单链表中取元素、插入和删除操作在开始不判断给定位置i的合法性?

5、当给定位置大于单链表长度时,取元素、插入和删除操作分别是如何执行的?

6、如何改进单链表的定义,使其可以在操作前判断判断给定位置i的合法性?

六、实验报告内容

1、实验目的

2、实验内容和具体要求

3、完成情况和实验记录,实验记录为实验过程中遇到的问题及解决方法

4、程序清单

5、所输入的数据及相应的运行结果6、问题回答7、实验心得

实验二、栈和队列的应用

一、实验目的

1、掌握栈的特点(先进后出FILO)及基本操作,如入栈、出栈等,栈的顺序存储结构和链式存储结构,以便在实际问题背景下灵活应用。

2、掌握队列的特点(先进先出FIFO)及基本操作,如入队、出队等,队列顺序存储结构、链式存储结构和循环队列的实现,以便在实际问题背景下灵。

二、实验内容

1.顺序栈的实现和运算

2.链栈的实现和运算

3.顺序队列的实现和运算

4.链式队列的实现和运算

5.循环队列的实现和运算

三、实验要求

1.用C++/C完成算法设计和程序设计并上机调试通过。

2.撰写实验报告,提供实验结果和数据。

3.分析算法,要求给出具体的算法分析结果,包括时间复杂度和空间复杂度,并简要给出算法设计小结和心得。

四、程序实现

写出每个操作的算法(操作过程)

程序运行情况

五、写出输入数据及运行结果

六、源程序清单。

 程序1:

顺序栈的实现和运算

#include

#defineMAXN26

charstack[MAXN];

inttop=0;

 

intpush(charx)

{if(top>=MAXN)

return

(1);

stack[top++]=x;

return(0);

}

 

intpop(char*p_y)

{if(top==0)

return

(1);

*p_y=stack[--top];

return(0);

}

 

voidmain()

{inti;

charch_x,ch_y;

printf("inputthecharyouwanttopush\n");

scanf("%c",&ch_x);

while(ch_x!

='0')

if(push(ch_x)==1)printf("failure!

\n");

else

{printf("success!

\n");

printf("inputacharforch_xtopush\nch_x=");

getchar();

scanf("%c",&ch_x);}

i=0;

while(stack[i]!

='\0')

{printf("%c",stack[i]);

i++;}

 

if(pop(&ch_y)==1)printf("failure!

\n");

else

{printf("success!

\n");

printf("Thepopcharis%c\n",ch_y);}

for(i=top-1;i>=0;i--)

printf("%c",stack[i]);

}

程序2:

链栈的实现和运算

#include

#include

structnode{chardata;

structnode*link;

};

typedefstructnodeNODE;

NODE*top=NULL;

 

voidpush_l(charx)

{NODE*p;

p=(NODE*)malloc(sizeof(NODE));

p->data=x;

p->link=top;

top=p;

}

intpop_l(char*p_y)

{NODE*p;

if(top==NULL)

return

(1);

*p_y=top->data;

p=top;

top=top->link;

free(p);

return(0);

}

 

voidmain()

{NODE*p;

charch_x,ch_y;

 

printf("inputthecharyouwanttopush\n");

scanf("%c",&ch_x);

while(ch_x!

='0')

{push_l(ch_x);

getchar();

scanf("%c",&ch_x);}

 

p=(NODE*)malloc(sizeof(NODE));

p=top;

while(p!

=NULL)

{printf("%c",p->data);

p=p->link;}

printf("\n");

 

if(pop_l(&ch_y)==1)printf("failure!

\n");

else

{printf("success!

\n");

printf("Thepopcharis%c\n",ch_y);}

 

p=(NODE*)malloc(sizeof(NODE));

p=top;

while(p!

=NULL)

{printf("%c",p->data);

p=p->link;}

printf("\n");

}

程序3:

顺序队列的实现和运算

#include

#defineMAXN26

charq[MAXN];

inthead=-1,tail=-1;

 

inten_queue(charx)

{if(tail==MAXN-1)

return

(1);

q[++tail]=x;

return(0);

}

 

intde_queue(char*p_y)

{if(head==tail)

return

(1);

*p_y=q[++head];

return(0);

}

 

voidmain()

{inti;

charch_x,ch_y;

printf("inputthecharyouwanttoenqueue\n");

scanf("%c",&ch_x);

while(ch_x!

='0')

if(en_queue(ch_x)==1)printf("failure!

\n");

else

{printf("success!

\n");

printf("inputacharforch_xtoenqueue\nch_x=");

getchar();

scanf("%c",&ch_x);}

i=1;

while(q[i]!

='\0')

{printf("%c",q[i]);

i++;}

if(de_queue(&ch_y)==1)printf("failure!

\n");

else

{printf("success!

\n");

printf("Thedequeuecharis%c\n",ch_y);}

for(i=head+1;i<=tail;i++)

printf("%c",q[i]);

}

程序4:

链式队列的实现和运算

#include

#include"

structnode{chardata;

structnode*link;

};

typedefstructnodeNODE;

NODE*head,*tail;

 

voiden_queue_l(charx)

{NODE*p;

p=(NODE*)malloc(sizeof(NODE));

p->data=x;

p->link=NULL;

if(head==NULL)

head=p;

else

tail->link=p;

tail=p;

}

intde_queue_l(char*p_y)

{NODE*p;

if(head==NULL)

return

(1);

*p_y=head->data;

p=head;

head=head->link;

free(p);

return(0);

}

 

voidmain()

{NODE*p;

charch_x,ch_y;

printf("inputthecharyouwanttoenqueue\n");

scanf("%c",&ch_x);

while(ch_x!

='0')

{en_queue_l(ch_x);

getchar();

scanf("%c",&ch_x);}

 

p=(NODE*)malloc(sizeof(NODE));

p=head;

while(p!

=NULL)

{printf("%c",p->data);

p=p->link;}

printf("\n");

if(de_queue_l(&ch_y)==1)printf("failure!

\n");

else

{printf("success!

\n");

printf("Thedequeuecharis%c\n",ch_y);}

p=(NODE*)malloc(sizeof(NODE));

p=head;

while(p!

=NULL)

{printf("%c",p->data);

p=p->link;}

printf("\n");

}

程序5:

循环队列的实现和运算

#include

#include

#defineMAXN26

charq[MAXN];

inthead=0,tail=0;

 

inten_c_q(charx)

{tail=(tail+1)%MAXN;

if(tail==head)

{if(tail==0)tail=MAXN-1;

elsetail--;

return

(1);}

q[tail]=x;

return(0);

}

 

intde_c_q(char*p_y)

{if(head==tail)

return

(1);

head=(head+1)%MAXN;

*p_y=q[head];

return(0);}

 

voidmain()

{inti;

charch_x,ch_y;

printf("inputthecharyouwanttoenqueue\n");

scanf("%c",&ch_x);

while(ch_x!

='0')

if(en_c_q(ch_x)==1)printf("failure!

\n");

else

{printf("success!

\n");

printf("inputacharforch_xtoenqueue\nch_x=");

getchar();

scanf("%c",&ch_x);}

i=1;

while(q[i]!

='\0')

{printf("%c",q[i]);

i++;}

if(de_c_q(&ch_y)==1)printf("failure!

\n");

else

{printf("success!

\n");

printf("Thedequeuecharis%c\n",ch_y);}

for(i=head+1;i<=tail;i++)

printf("%c",q[i]);

}

实验三、二叉树的遍历

一、实验目的

1、掌握二叉树的特点及其存储方式。

2、掌握二叉树的创建。

3、掌握二叉树前序、中序、后序遍历的基本方法及应用。

二、实验内容

1、用前序方法建立一棵二叉树。

2、编写前序遍历二叉树的程序。

3、编写中序遍历二叉树的程序。

4、编写后序遍历二叉树的程序。

5、编写统计二叉树叶子结点个数的程序

三、实验环境

TC或VC++

四、实验步骤

1、二叉树的二叉链表存储类型定义

typedefstructBiTNode

{datatypedata;

structBiTNode*lchild,*rchild;

}BiTNode,*BiTree;

2、建立下图所示的二叉树

以字符串的形式“根左子树右子树”定义一棵二叉树时,创建二叉树的算法如下:

StatusCreateBiTree(BiTree&T){

scanf(&ch);

if(ch=='')T=NULL;

else{

if(!

(T=newBiTNode))

exit(OVERFLOW);

T->data=ch;//生成根结点

CreateBiTree(T->lchild);//构造左子树

CreateBiTree(T->rchild);//构造右子树

}

returnOK;}//CreateBiTree

3、编程实现以上二叉树的前序、中序和后序遍历操作,输出遍历序列

(1)先序遍历二叉树的递归算法如下:

voidPreorder(BiTreeT,void(*visit)(TElemType&e))

{//先序遍历二叉树

if(T){

visit(T->data);//访问结点

Preorder(T->lchild,visit);//遍历左子树

Preorder(T->rchild,visit);//遍历右子树

}

}

(2)中序遍历二叉树的递归算法如下:

voidInorder(BiTreeT,void(*visit)(TElemType&e))

{//中序遍历二叉树

if(T){

Inorder(T->lchild,visit);//遍历左子树

visit(T->data);//访问结点

Inorder(T->rchild,visit);//遍历右子树

}

}

(3)后序遍历二叉树的递归算法如下:

voidPostorder(BiTreeT,void(*visit)(TElemType&e))

{//后序遍历二叉树

if(T){

Postorder(T->lchild,visit);//遍历左子树

Postorder(T->rchild,visit);//遍历右子树

visit(T->data);//访问结点

}

}

(4)先序遍历二叉树的非递归算法如下:

StatusPreOrderTraverse(BiTreeT,Status(*visit)(TElemType&e)){

InitStack(S);p=T;

While(p||!

StackEmpty(S)){

if(p){if(!

visit(p->data))returnERROR;

Push(S,p);p=p->lchild;}

else{

Pop(S,p);

p=p->rchild;

}//else

}//while

returnOK;

}

(5)中序遍历二叉树的非递归算法如下:

StatusInOrderTraverse(BiTreeT,Status(*visit)(TElemType&e)){

InitStack(S);p=T;

While(p||!

StackEmpty(S)){

if(p){Push(S,p);p=p->lchild;}

else{

Pop(S,p);

if(!

visit(p->data))returnERROR;

p=p->rchild;

}//else

}//while

returnOK;

}

4、统计以上二叉树中叶子结点的个数

算法基本思想:

先序(或中序或后序)遍历二叉树,在遍历过程中查找叶子结点,并计数。

由此,需在遍历算法中增添一个“计数”的参数,并将算法中“访问结点”的操作改为:

若是叶子,则计数器增1。

算法如下:

voidCountLeaf(BiTreeT,int&count){

if(T){

if((!

T->lchild)&&(!

T->rchild))

count++;//对叶子结点计数

CountLeaf(T->lchild,count);

CountLeaf(T->rchild,count);

}//if

}//CountLeaf

五、问题讨论

1、先序、中序、后序遍历二叉树的区别?

2、在先序、中序非递归算法中为什么使用栈?

能不能借助其它数据结构来实现?

六、实验报告内容

1、实验目的

2、实验内容和具体要求

3、完成情况和实验记录,实验记录为实验过程中遇到的问题及解决方法

4、程序清单

5、所输入的数据及相应的运行结果

6、问题回答

7、实验心得

 

实验四图的遍历操作

一、实验目的:

1.掌握图的含义。

2.掌握用邻接矩阵和邻接表的方法描述图的存储结构。

3.理解并掌握深度优先遍历和广度优先遍历的存储结构。

二、实验内容:

从以下1、2和3、4中各选择一项内容

1.建立无向图的邻接矩阵,并实现插入、删除边的功能。

2.建立有向

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

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2