计算机软件技术基础实验手册.docx
《计算机软件技术基础实验手册.docx》由会员分享,可在线阅读,更多相关《计算机软件技术基础实验手册.docx(24页珍藏版)》请在冰豆网上搜索。
计算机软件技术基础实验手册
《计算机软件技术基础》实验教学大纲
一、基本信息
课程编码
020213050
课程学时
56
课程类别
技术基础课
实验总学时
4
开出学期
第六学期
开出单位
信息学院计算机系
适用专业
自动化、电子信息工程、通信工程
二、实验安排
序号
实验项目
实验学时
每组人数
实验类型
开出要求
1
线性表的建立与遍历
2
1
验证性
必做
2
二叉树的建立与遍历
2
1
验证性
必做
三、实验目的、内容与要求
实验一线性表的建立与遍历
(一)实验目的
进一步理解线性表的逻辑结构和存储结构,掌握线性表的建立与遍历算法。
(二)实验内容
1、给定一个输入序列,建立顺序表,访问输出顺序表中各结点的内容。
2、给定一个输入序列,建立线性链表,访问输出线性链表中各结点的内容。
(三)实验要求
1、掌握线性表的建立与遍历算法的实现;
2、根据实验内容,用C语言编程实现,上机调试运行得出实验结果;
3、写出预习报告和实验报告。
实验二二叉树的建立与遍历
(一)实验目的
进一步理解二叉树的逻辑结构和存储结构,掌握二叉树的建立与遍历算法。
(二)实验内容
1、用二叉链表创建二叉树
①输入根结点值;②若左子树不空,则输入左子树,否则输入一个结束符;
③若右子树不空,则输入右子树,否则输入一个结束符。
例如:
FCA▲▲DB▲▲▲E▲GH▲▲P▲▲其中▲表示结束符
2、遍历该二叉树
(1)前序遍历(DLR)
若二叉树为空,则结束返回。
否则:
①访问根结点;
②前序遍历左子树;
③前序遍历右子树。
(2)中序遍历(LDR)
若二叉树为空,则结束返回。
否则:
①中序遍历左子树;
②访问根结点;
③中序遍历左子树。
(3)后序遍历(LRD)
若二叉树为空,则结束返回。
否则:
①后序遍历左子树;
②后序遍历左子树;
③访问根结点。
(三)实验要求
1、掌握二叉树的建立与遍历算法的实现;
2、根据实验内容,用C语言编程实现,上机调试运行得出实验结果;
3、写出预习报告和实验报告。
四、考核方式
根据实验课考勤、课前预习情况、课上实验能力、原型系统效果验收与实验报告的完成情况确定最终的实验成绩,实验成绩占课程总成绩的10%。
五、建议教材与教学参考书
1、课程教材
[1]沈被娜等编.《计算机软件技术基础》(第三版).北京.清华大学出版社.2000
2、实验指导书
[1]计算机软件技术基础实验指导书.赵俊生(自编).2009
六、编制说明
编制者:
赵俊生组长:
赵俊生
执笔人:
赵俊生编制时间:
2009年3月
实验一线性表的建立与遍历
一、实验目的
进一步理解线性表的逻辑结构和存储结构,掌握线性表的建立与遍历算法
二、实验题目
线性表的建立与遍历
三、实验类型
验证性
四、实验内容
1、给定一个输入序列,建立顺序表,访问输出顺序表中各结点的内容。
2、给定一个输入序列,建立线性链表,访问输出线性链表中各结点的内容。
五、实验要求
根据实验内容,用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)
vectorA;
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)
vectorA;
intn;
{
intj;
if(i<1||i>n)printf("i值错误!
\n");
else
{
for(j=i;j<=n;j++)A[j]=A[j+1];/*将第i个元素之后的元素前移*/
n--;
}
}
④向量的查找
在一个有n个元素的向量A中查找元素值为x的元素的函数如下:
voidfind(A,n,x)
vectorA;
intn,x;
{
inti;
i=1;
while(i<=n&&A[i]<>x)i++;
if(i<=n)
printf("找到了!
\n");
else
printf("未找到!
\n");
}
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;/*删除头结点*/
p->next=NULL;
}
②查找某个结点
在已建立好的单链表(表头指针为head)中查找元素值为x的函数如下:
voidfind(head,x)
node*head;
intx;
{
node*p;
p=head;
while(p->data!
=x&&p!
=NULL)p=p->next;
if(p!
=NULL)
printf("结点找到了!
\n");
else
printf("结点未找到!
\n");
}
③求单链表的长度
计算一个已建立好的单链表(表头指针为head)的结点个数的函数如下:
intlength(head)
nodehead;
{
intn=0;
node*p;
p=head;
while(p!
=NULL)
{
p=p->next;
n++;
}
return(n);
}
④在单链表中插入一个结点
在单链表中第i个结点(i≥0)之后插入一个元素为x的结点的函数如下:
voidinsert(head,i,x)
node*head;
inti,x;
{
node*s,*p;
intj;
s=(node*)malloc(sizeof(node));/*建立一个待插入的结点s*/
s->data=x;
if(i==0)/*如果i=0,则将s所指结点插入到表头后返回*/
{
s->next=head;
head=s;
}
else
{
p=head;j=1;/*在单链表中查找第i个结点,由p所指向*/
while(p!
=NULL&&j
{j++;
p=p->next;
}
if(p!
=NULL)/*若查找成功,则把s插入到其后*/
{
s->next=p->next;
p->next=s;
}
else
printf("未找到!
\n");
}
}
⑤从单链表中删除一个结点做
从单链表中删除一个其值等于给定值x的结点的函数如下:
voiddelete(head,x)
node*head;
intx;
{
node*p,*q;
if(head==NULL)printf("链表下溢!
\n");/*如果单链表为空,则下溢处理*/
if(head->data==x)/*如果表头结点值等于x值,则删除之*/
{
p=head;
head=head->next;
free(p);
}
else
{
q=head;p=head->next;/*从第二个结点开始查找其值为x的结点*/
while(p!
=NULL&&p->data!
=x)
if(p->data!
=x)/*在查找时,p指向该结点,q指向其前一结点*/
{
q=p;p=p->next;
}
if(p!
=NULL)/*若找到了该结点,则进行删除处理*/
{
q->next=p->next;
free(p);
}
else/*未找到时,显示相应信息*/
printf("未找到!
\n");
}
}
⑥建立、遍历单链表(方法二)
intcount_nohead(LINKLIST*head){
/*不带头结点的单链表:
输出单链表元素值并计数*/
inti=0;
LINKLIST*p;
p=head;
printf("输出单链表元素值:
");
while(p!
=NULL)
{printf("%c",p->data);
i++;
p=p->next;}
printf("\n");
returni;
}
intcount_head(LINKLIST*head){
/*带头结点的单链表:
输出单链表元素值并计数*/
inti=0;
LINKLIST*p;
p=head->next;
printf("输出单链表元素值:
");
while(p!
=NULL)
{printf("%c",p->data);
i++;
p=p->next;}
printf("\n");
returni;
}
LINKLIST*creatlink_nohead_head(LINKLIST*head){
/*用头插入法建立不带头结点的单链表*/
LINKLIST*t;
charch;
printf("单链表元素值为单个字符,连续输入,$为结束字符:
");
while((ch=getchar())!
='$')
{t=(LINKLIST*)malloc(sizeof(LINKLIST));
t->data=ch;
t->next=head;
head=t;}
return(head);
}
LINKLIST*creatlink_head_head(LINKLIST*head){
/*用头插入法建立带头结点的单链表*/
LINKLIST*t;
charch;
t=(LINKLIST*)malloc(sizeof(LINKLIST));
head=t;
t->next=NULL;
printf("单链表元素值为单个字符,连续输入,$为结束字符:
");
while((ch=getchar())!
='$')
{t=(LINKLIST*)malloc(sizeof(LINKLIST));
t->data=ch;
t->next=head->next;
head->next=t;}
return(head);
}
LINKLIST*creatlink_nohead_rail(LINKLIST*head){
/*用尾插入法建立不带头结点的单链表*/
LINKLIST*last,*t;
charch;
last=head;
printf("单链表元素值为单个字符,连续输入,$为结束字符:
");
while((ch=getchar())!
='$')
{t=(LINKLIST*)malloc(sizeof(LINKLIST));
t->data=ch;
t->next=NULL;
if(head==NULL){head=t;last=t;}
else{last->next=t;last=t;}
}
return(head);
}
LINKLIST*creatlink_head_rail(LINKLIST*head){
/*用尾插入法建立带头结点的单链表*/
LINKLIST*last,*t;
charch;
t=(LINKLIST*)malloc(sizeof(LINKLIST));
head=t;last=t;
t->next=NULL;
printf("单链表元素值为单个字符,连续输入,$为结束字符:
");
while((ch=getchar())!
='$')
{t=(LINKLIST*)malloc(sizeof(LINKLIST));
t->data=ch;
t->next=NULL;
last->next=t;
last=t;}
return(head);
}
LINKLIST*creatlink_order_head(LINKLIST*head)
/*建立带头结点的有序单链表*/
{LINKLIST*t,*p,*q;
charch;
t=(LINKLIST*)malloc(sizeof(LINKLIST));
head=t;t->next=NULL;
printf("单链表元素值为单个字符,连续输入,$为结束字符:
");
while((ch=getchar())!
='$')
{t=(LINKLIST*)malloc(sizeof(LINKLIST));
t->data=ch;
q=head;p=head->next;
while(p!
=NULL&&p->data<=ch){
q=p;p=p->next;}
q->next=t;t->next=p;
}
return(head);
}
main()
{LINKLIST*head,*a1,*a2,*c;
intnum=0,loop,j;
charch;
loop=1;
while(loop){
printf("\n\n");
printf("1--建立单链表(头插入,不带头结点)\n");
printf("2--建立单链表(头插入,带头结点)\n");
printf("3--建立单链表(尾插入,不带头结点)\n");
printf("4--建立单链表(尾插入,带头结点)\n");
printf("请选择项号:
");
scanf("%d",&j);
fflush(stdin);
printf("\n\n");
if(j>=1&&j<=10)
switch(j){
case1:
printf("\n建立单链表\n\n");
head=NULL;
head=creatlink_nohead_head(head);
fflush(stdin);
num=count_nohead(head);
printf("单链表元素个数=%d\n",num);
break;
case2:
printf("\n建立单链表\n\n");
head=NULL;
head=creatlink_head_head(head);
fflush(stdin);
num=count_head(head);
printf("单链表元素个数=%d\n",num);
break;
case3:
printf("\n建立单链表\n\n");
head=NULL;
head=creatlink_nohead_rail(head);
fflush(stdin);
num=count_nohead(head);
printf("单链表元素个数=%d\n",num);
break;
case4:
printf("\n建立单链表\n\n");
head=NULL;
head=creatlink_head_rail(head);
fflush(stdin);
num=count_head(head);
printf("单链表元素个数=%d\n",num);
break;
}
printf("结束此练习吗?
(0--结束1--继续):
");
scanf("%d",&loop);
printf("\n");
}
}
实验二二叉树的建立与遍历
一、实验目的
进一步理解二叉树的逻辑结构和存储结构,掌握二叉树的建立与遍历算法。
二、实验题目
二叉树的建立与遍历
三、实验类型
验证性
四、实验内容
1、用二叉链表创建二叉树
①输入根结点值;②若左子树不空,则输入左子树,否则输入一个结束符;
③若右子树不空,则输入右子树,否则输入一个结束符。
例如:
FCA▲▲DB▲▲▲E▲GH▲▲P▲▲其中▲表示结束符
2、遍历该二叉树
(1)先序遍历(DLR)
若二叉树为空,则结束返回。
否则:
①访问根结点;
②先序遍历左子树;
③先序遍历右子树。
(2)中序遍历(LDR)
若二叉树为空,则结束返回。
否则:
①中序遍历左子树;
②访问根结点;
③中序遍历左子树。
(3)后序遍历(LRD)
若二叉树为空,则结束返回。
否则:
①后序遍历左子树;
②后序遍历左子树;
③访问根结点。
五、实验要求
根据实验内容,用C语言编程实现,上机调试运行得出实验结果,写出实验报告。
六、实验提示
1、以二叉链表的存储结构的方式创建如下图的二叉树creatree
可以采用数据类型定义:
typedefstructnode
{datatypedata;//每个结点的数据域
structnode*lchild,*rchild;
//结点的左孩子指针域lchild,右孩子指针域rchild
}JD;
2.试以上题已建立的二叉链表为已知二叉树,编写按先序、中序和后序遍历二叉树的算法
七、实验报告
1、写出每个算法的思想。
2、画出算法流程图。
3、调试程序出现的问题及解决的方法。
4、打印实验报告及程序清单。
5、报告给出测试的结果并写出设计体会。
6、报告按信息学院统一格式书写。
八、范例参考
1、问题描述(两种方法建立二叉树)
1)做二叉树的建立:
设有一棵二叉树如图(a),将二叉树模拟为完全二叉树从根开始对结点进行编号,编号从1开始,结果如图(b)所示。
在运行过程中要求输入结点对应的编号和值时,请按图(c)中的数据输入,最后以编号I=0;结点值x=’$’结束。
2)二叉树中序遍历:
对建立的二叉树进行中序遍历,并输出遍历结果.中序遍历算法可以用递归算法实现,也可以用非递归算法实现.
2、程序清单
#include
#include"datastru.h"
#include
typedefstructnode1
{chardata;
structnode1*lchild,*rchild;
}BTCHINALR;
BTCHINALR*createbt()
{BTCHINALR*q;
structnode1*s[30];
intj,i,x;
printf("建立二叉树,输入结点对应的编号和值,编号和值之间用逗号隔开\n\n");
printf("i,x=");
scanf("%d,%c",&i,&x);
while(i!
=0&&x!
='$')
{q=(BTCHINALR*)malloc(sizeof(BTCHINALR));/*建立一个新结点q*/
q->data=x;q->lchild=NULL;q->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,x=");
scanf("%d,%c",&i,&x);}
returns[1];/*返回根结点地址*/
}
voidinorder(BTCHIN