计算机软件技术基础实验指导书06版.docx

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

计算机软件技术基础实验指导书06版.docx

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

计算机软件技术基础实验指导书06版.docx

计算机软件技术基础实验指导书06版

 

《计算机软件技术基础》实验指导书

赵俊生编

 

内蒙古工业大学信息工程学院计算机系

2009年3月1日

《计算机软件技术基础》实验教学大纲

一、基本信息

课程编码

020213050

课程学时

56

课程类别

技术基础课

实验总学时

4

开出学期

第六学期

开出单位

信息学院计算机系

适用专业

自动化、电子信息工程、通信工程

二、实验安排

序号

实验项目

实验学时

每组人数

实验类型

开出要求

1

线性表的建立与遍历

2

1

验证性

必做

二叉树的建立与遍历

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,

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

当前位置:首页 > 解决方案 > 学习计划

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

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