计算机软件技术基础实验指导书06版Word格式文档下载.docx

上传人:b****6 文档编号:21579501 上传时间:2023-01-31 格式:DOCX 页数:24 大小:67.44KB
下载 相关 举报
计算机软件技术基础实验指导书06版Word格式文档下载.docx_第1页
第1页 / 共24页
计算机软件技术基础实验指导书06版Word格式文档下载.docx_第2页
第2页 / 共24页
计算机软件技术基础实验指导书06版Word格式文档下载.docx_第3页
第3页 / 共24页
计算机软件技术基础实验指导书06版Word格式文档下载.docx_第4页
第4页 / 共24页
计算机软件技术基础实验指导书06版Word格式文档下载.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

计算机软件技术基础实验指导书06版Word格式文档下载.docx

《计算机软件技术基础实验指导书06版Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《计算机软件技术基础实验指导书06版Word格式文档下载.docx(24页珍藏版)》请在冰豆网上搜索。

计算机软件技术基础实验指导书06版Word格式文档下载.docx

1、掌握线性表的建立与遍历算法的实现;

2、根据实验内容,用C语言编程实现,上机调试运行得出实验结果;

3、写出预习报告和实验报告。

实验二二叉树的建立与遍历

进一步理解二叉树的逻辑结构和存储结构,掌握二叉树的建立与遍历算法。

1、用二叉链表创建二叉树

①输入根结点值;

②若左子树不空,则输入左子树,否则输入一个结束符;

③若右子树不空,则输入右子树,否则输入一个结束符。

例如:

FCA▲▲DB▲▲▲E▲GH▲▲P▲▲其中▲表示结束符

2、遍历该二叉树

(1)前序遍历(DLR)

若二叉树为空,则结束返回。

否则:

①访问根结点;

②前序遍历左子树;

③前序遍历右子树。

(2)中序遍历(LDR)

①中序遍历左子树;

②访问根结点;

③中序遍历左子树。

(3)后序遍历(LRD)

①后序遍历左子树;

②后序遍历左子树;

③访问根结点。

1、掌握二叉树的建立与遍历算法的实现;

四、考核方式

根据实验课考勤、课前预习情况、课上实验能力、原型系统效果验收与实验报告的完成情况确定最终的实验成绩,实验成绩占课程总成绩的10%。

五、建议教材与教学参考书

1、课程教材

[1]沈被娜等编.《计算机软件技术基础》(第三版).北京.清华大学出版社.2000

2、实验指导书

[1]计算机软件技术基础实验指导书.赵俊生(自编).2009

六、编制说明

编制者:

赵俊生组长:

赵俊生

执笔人:

赵俊生编制时间:

2009年3月

一、实验目的

进一步理解线性表的逻辑结构和存储结构,掌握线性表的建立与遍历算法

二、实验题目

线性表的建立与遍历

三、实验类型

验证性

四、实验内容

五、实验要求

根据实验内容,用C语言编程实现,上机调试运行得出实验结果,写出实验报告。

六、实验提示

1、线性结构中的所有结点按它们之间的关系可以排成一个线性序列:

k1,k2,…,kn

其中k1是开始结点,kn是终端结点,ki是ki+1的前驱结点,而ki+1是ki的后继结点(i=1,2,…,n-1)。

通常把上述线性序列称为“线性表”,把线性结构中的结点称为元素或“表目”。

将一个线性

表存放到计算机中,可以采用不同的方法,其中最简单而自然的就是顺序的方法,即把表目按其索引值从小到大一个接一个地存放在相邻的单元里。

顺序方法存储的线性表简称“顺序表”,顺序表是一种紧凑结构。

2、常用的链表有单链表和双链表。

在单链表中分配给每个结点的存储单元可分为两个部分:

一部分存放结点的数据,称为data域,另一部分存放指向结点后续结点的指针,称为next域,终端结点没有后继结点,其next域为NULL,在计算机中可以表示成零或负数,另外还需要一个表头变量head指向链表的第一个结点。

七、实验报告

1、写出每个算法的思想。

2、画出算法流程图。

3、调试程序出现的问题及解决的方法。

4、打印实验报告及程序清单。

5、报告给出测试的结果并写出实验体会。

6、报告按信息学院统一格式书写。

八、范例参考

1、顺序表

1向量的建立

向量的定义如下:

typedefElemTypevector[n0]

输入n个整数,产生一个存储这些整数的向量A的函数如下:

voidcreate(A,n)

vectorA;

intn;

{

inti;

for(i=1;

i<

=n;

i++)

scanf(“%d”,A[i]);

}

2向量的插入

在一个有n个元素的向量A中的第i个元素之前插入一个元素x的函数如下:

voidinsert(A,n,x)

intn,x;

intj;

if(i<

1||i>

n)printf(“i值错误!

\n”);

else

{

for(j=n;

j>

=i;

j--)A[j+1]=A[j];

/*将第i个元素及其后的元素后移*/

A[i]=x;

n++;

/*向量长度增1*/

③向量的删除

在一个有n个元素的向量A中删除第i个元素的函数如下:

voiddelete(A,n)

if(i<

n)printf("

i值错误!

\n"

);

else

for(j=i;

j<

j++)A[j]=A[j+1];

/*将第i个元素之后的元素前移*/

n--;

}

④向量的查找

在一个有n个元素的向量A中查找元素值为x的元素的函数如下:

voidfind(A,n,x)

vectorA;

intn,x;

i=1;

while(i<

=n&

&

A[i]<

>

x)i++;

=n)

printf("

找到了!

未找到!

2、链表

①建立一个单链表(方法一)

单链表的结点类型node定义如下:

typedefstructlinknode

ElemTypedata;

structlinknode*next;

}node;

输入一系列整数,以0标志结束,将这些整数作为data域建立一个单链表的函数如下:

voidcreat()

node*head,*p,*s;

intx,cycle=1;

/*cycle是循环控制变量*/

head=(node*)malloc(sizeof(node));

/*建立头结点,由head所指向*/

p=head;

while(cycle)

scanf("

%d"

&

x);

if(x!

=0)

s=(node*)malloc(sizeof(node));

/*建立下一个结点,由s所指向*/

s->

data=x;

p->

next=s;

p=s;

elsecycle=0;

head=head->

next;

/*删除头结点*/

next=NULL;

    ②查找某个结点

在已建立好的单链表(表头指针为head)中查找元素值为x的函数如下:

voidfind(head,x)

node*head;

intx;

node*p;

while(p->

data!

=x&

p!

=NULL)p=p->

if(p!

=NULL)

结点找到了!

结点未找到!

③求单链表的长度

计算一个已建立好的单链表(表头指针为head)的结点个数的函数如下:

intlength(head)

nodehead;

intn=0;

while(p!

p=p->

n++;

return(n);

④在单链表中插入一个结点

在单链表中第i个结点(i≥0)之后插入一个元素为x的结点的函数如下:

voidinsert(head,i,x)

inti,x;

node*s,*p;

/*建立一个待插入的结点s*/

if(i==0)/*如果i=0,则将s所指结点插入到表头后返回*/

next=head;

head=s;

j=1;

/*在单链表中查找第i个结点,由p所指向*/

=NULL&

i)

{j++;

=NULL)/*若查找成功,则把s插入到其后*/

next=p->

⑤从单链表中删除一个结点

从单链表中删除一个其值等于给定值x的结点的函数如下:

voiddelete(head,x)

node*p,*q;

if(head==NULL)printf("

链表下溢!

/*如果单链表为空,则下溢处理*/

if(head->

data==x)/*如果表头结点值等于x值,则删除之*/

free(p);

q=head;

p=head->

/*从第二个结点开始查找其值为x的结点*/

p->

=x)

if(p->

=x)/*在查找时,p指向该结点,q指向其前一结点*/

q=p;

p=p->

=NULL)/*若找到了该结点,则进行删除处理*/

q->

else/*未找到时,显示相应信息*/

}

⑥建立、遍历单链表(方法二)

intcount_nohead(LINKLIST*head){

/*不带头结点的单链表:

输出单链表元素值并计数*/

inti=0;

LINKLIST*p;

p=head;

输出单链表元素值:

"

while(p!

=NULL)

{printf("

%c"

p->

data);

i++;

p=p->

returni;

intcount_head(LINKLIST*head){

/*带头结点的单链表:

p=head->

LINKLIST*creatlink_nohead_head(LINKLIST*head){

/*用头插入法建立不带头结点的单链表*/

LINKLIST*t;

charch;

单链表元素值为单个字符,连续输入,$为结束字符:

while((ch=getchar())!

='

$'

{t=(LINKLIST*)malloc(sizeof(LINKLIST));

t->

data=ch;

next=head;

head=t;

return(head);

LINKLIST*creatlink_head_head(LINKLIST*head){

/*用头插入法建立带头结点的单链表*/

t=(LINKLIST*)malloc(sizeof(LINKLIST));

next=NULL;

{t=(LINKLIST*)malloc(sizeof(LINKLIST));

next=head->

head->

next=t;

return(head);

LINKLIST*creatlink_nohead_rail(LINKLIST*head){

/*用尾插入法建立不带头结点的单链表*/

LINKLIST*last,*t;

last=head;

while((ch=getchar())!

{t=(LINKLIST*)malloc(sizeof(LINKLIST));

if(head==NULL){head=t;

last=t;

else{last->

return(head);

LINKLIST*creatlink_head_rail(LINKLIST*head){

/*用尾插入法建立带头结点的单链表*/

last->

LINKLIST*creatlink_order_head(LINKLIST*head)

/*建立带头结点的有序单链表*/

{LINKLIST*t,*p,*q;

q=head;

while(p!

=NULL&

data<

=ch){

q=p;

next=p;

main()

{LINKLIST*head,*a1,*a2,*c;

intnum=0,loop,j;

loop=1;

while(loop){

\n\n"

1--建立单链表(头插入,不带头结点)\n"

2--建立单链表(头插入,带头结点)\n"

3--建立单链表(尾插入,不带头结点)\n"

4--建立单链表(尾插入,带头结点)\n"

请选择项号:

scanf("

j);

fflush(stdin);

if(j>

=1&

j<

=10)

switch(j){

case1:

\n建立单链表\n\n"

head=NULL;

head=creatlink_nohead_head(head);

fflush(stdin);

num=count_nohead(head);

printf("

单链表元素个数=%d\n"

num);

break;

case2:

head=creatlink_head_head(head);

num=count_head(head);

case3:

head=creatlink_nohead_rail(head);

case4:

head=creatlink_head_rail(head);

}

结束此练习吗?

(0--结束1--继续):

loop);

一、实验目的

三、实验类型

1、用二叉链表创建二叉树

(1)先序遍历(DLR)

②先序遍历左子树;

③先序遍历右子树。

1、以二叉链表的存储结构的方式创建如下图的二叉树creatree

可以采用数据类型定义:

typedefstructnode

{datatypedata;

//每个结点的数据域

structnode*lchild,*rchild;

//结点的左孩子指针域lchild,右孩子指针域rchild

}JD;

2.试以上题已建立的二叉链表为已知二叉树,编写按先序、中序和后序遍历二叉树的算法

5、报告给出测试的结果并写出设计体会。

1、问题描述(两种方法建立二叉树)

1)二叉树的建立:

设有一棵二叉树如图(a),将二叉树模拟为完全二叉树从根开始对结点进行编号,编号从1开始,结果如图(b)所示。

在运行过程中要求输入结点对应的编号和值时,请按图(c)中的数据输入,最后以编号I=0;

结点值x=’$’结束。

2)二叉树中序遍历:

对建立的二叉树进行中序遍历,并输出遍历结果.中序遍历算法可以用递归算法实现,也可以用非递归算法实现.

2、程序清单

#include<

stdio.h>

#include"

datastru.h"

malloc.h>

typedefstructnode1

{chardata;

structnode1*lchild,*rchild;

}BTCHINALR;

BTCHINALR*createbt()

{BTCHINALR*q;

structnode1*s[30];

intj,i,x;

建立二叉树,输入结点对应的编号和值,编号和值之间用逗号隔开\n\n"

i,x="

%d,%c"

i,&

while(i!

=0&

x!

{q=(BTCHINALR*)malloc(sizeof(BTCHINALR));

/*建立一个新结点q*/

q->

data=x;

lchild=NULL;

rchild=NULL;

s[i]=q;

/*q新结点地址存入s指针数组中*/

if(i!

=1)/*i=1,对应的结点是根结点*/

{j=i/2;

/*求双亲结点的编号j*/

if(i%2==0)s[j]->

lchild=q;

/*q结点编号为偶数则挂在双亲结点j的左边*/

elses[j]->

rchild=q;

}/*q结点编号为奇数则挂在双亲结点j的右边*/

printf("

i,

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

当前位置:首页 > 高等教育 > 医学

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

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