计算机软件技术基础实验手册Word文件下载.docx
- 文档编号:17846334
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:24
- 大小:52.08KB
计算机软件技术基础实验手册Word文件下载.docx
《计算机软件技术基础实验手册Word文件下载.docx》由会员分享,可在线阅读,更多相关《计算机软件技术基础实验手册Word文件下载.docx(24页珍藏版)》请在冰豆网上搜索。
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("
returns[1];
/*返回根结点地址*/
voidinorder(BTCHIN
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机软件 技术 基础 实验 手册