计算机软件技术基础实验指导书.docx
《计算机软件技术基础实验指导书.docx》由会员分享,可在线阅读,更多相关《计算机软件技术基础实验指导书.docx(35页珍藏版)》请在冰豆网上搜索。
计算机软件技术基础实验指导书
《计算机软件技术基础》
实验指导书
编写:
XXX
适用专业:
电器工程与自动化
通讯工程
电子信息工程
安徽建筑工业学院电子与信息工程学院
2007年9月
实验一:
线性链表的建立、查找、插入、删除实验
实验学时:
2
实验类型:
验证
实验要求:
必修
一、实验目的
通过本实验的学习,要求学生能够通过单链表的存储结构,掌握单链表的基本操作,包括单链表的建立、查找、插入、删除、输出等操作。
通过本实验可以巩固学生所学的线性表知识,提高编程能力,为后继课程的学习奠定基础。
二、实验内容
1、为线性表{10,30,20,50,40,70,60,90,80,100}创建一个带头结点的单链表;
2、在该链表上查找值为50,65的结点,并返回查找结果(找到:
返回在县新链表中的位置);
3、在该链表上值为50的结点后,插入一个值为120的结点;
4、删除该链表上值为70的结点。
写出各操作的实现函数,并上机验证。
三、实验原理、方法和手段
使用带头结点的单链表的表示线性表,通过实验,熟悉链表的创建、查找、插入、删除、输出等是链表的基本操作。
具体如下:
(1)首先定义单链表的节点结构;
(2)在单链表创建过程中,首先初始化一个带头结点的空链表,对线性表中的各元素依次通过键盘输入、建立该元素结点、插入到单链表中,实现单链表的创建过程;结点的插入有头插入和尾插入两种方法,采用不同方法时应注意元素的输入顺序。
(3)查找过程可以从头结点开始,将待查找的数据依次与每个结点的数据域比较,匹配及查找成功,弱链表访问完未找到匹配的元素,则查找不成功。
为能够返回查找成功的结点位置,在链表的搜索过程中,应设置一个计数器,记录搜索结点的序号;
(4)插入结点时,首先要通过查找算法,找到带插入结点的前驱结点,然后为带插入元素建立结点,通过指针的修改,将结点插入。
(5)删除结点时,首先要通过查找算法,找到待删除结点的前驱,然后通过指针的修改,将待删除结点从链表中卸下,释放该结点。
(6)以上操作的正确性,均可以通过链表的输出结果来验证。
因此,可以统一写一个单链表的输出函数。
四、实验组织运行要求
采用以学生自主训练为主的开放模式组织教学,教师予以答疑与指导。
五、实验条件
PC机一台、Windows操作系统、C++Builder软件或TurboC环境
六、实验步骤
(1)、将提前准备好的源程序录入计算机;
(2)、调试源程序,修正错误,记录实验数据;
(3)、分析运行结果,验证所编程序是否正确。
七、思考题
(1)、线性表的逻辑结构与存储结构的区别?
(2)、采用头插入和尾插入方法,建立单链表有何区别?
八、实验报告
(1)、实验预习:
仔细阅读实验指导书,复习教材关于线性表部分的内容和C语言中关于指针的内容。
(2)、实验记录的内容应包括源程序、实验数据和运行结果。
(3)、实验结论部分的内容应包括对实验结果的分析和总结,回答思考题。
参考程序
#include
typedefstructnode{
intinfo;/*每个元素数据信息*/
structnode*next;/*存放后继元素的地址*/
}linknode,*pointer;
voidcreatelink(pointer*list)
{
pointerp;
intx,n,i;
*list=(pointer)malloc(sizeof(linknode));
(*list)->next=NULL;
printf("\nInputtheNumberofnode:
");
scanf("%d",&n);/*输入结点个数*/
printf("\nInputthedatasofnode:
\n");
for(i=1;i<=n;i++)/*前插入法创建链表*/
{
scanf("%d",&x);
p=(pointer)malloc(sizeof(linknode));
p->info=x;
p->next=(*list)->next;
(*list)->next=p;
}
}
voidprint(pointerh)
{
pointerp;
p=h->next;
while(p)
{
printf("%6d",p->info);
p=p->next;
}
}
intindex(pointerlist,intx,pointer*pos)
{/*在链表list中,查找值为x的结点,成功返回结点位置i及结点指针pos,不成功返回0*/
pointerp;
inti=0;
p=list->next;
while(p)
{
i++;
if(p->info!
=x)
p=p->next;
else
{
*pos=p;
return(i);/*查找成功,返回结点位置i*/
}
}
return(0);/*查找不成功,返回0*/
}
intinsertlink(pointerlist,intitem,intx)
{/*在单链表list中,值为item的结点后,插入一个值为x的结点*/
pointerp,q;
intk;
k=index(list,item,&q);/*在链表h中查找值为50的结点,结点指针存入q中*/
if(k!
=0)
{/*找到值为item的结点,完成插入,并返回1*/
p=(pointer)malloc(sizeof(linknode));
p->info=x;
p->next=q->next;
q->next=p;
return
(1);
}
else/*未找到值为item的结点,并返回0*/
return(0);
}
intdeletelink(pointerlist,intx)
{/*删除值为x的结点*/
pointerp,q;
p=list->next;
while(p&&p->info!
=x)
{
q=p;
p=p->next;
}
if(!
p)
printf("Deletefail!
");
else
{
q->next=p->next;
free(p);
printf("Deletesuccess!
");
}
}
main()
{
pointerh,p;
intx,k;
/*建立链表*/
createlink(&h);
printf("Thelinklistis:
");
print(h);/*通过链表输出,检查链表建立的情况*/
/*查找*/
printf("\nInputthedataofindex:
");
scanf("%d",&x);/*输入待查找的结点值*/
k=index(h,x,&p);/*在链表h中查找值为x的结点*/
if(k!
=0)
printf("Success!
position=%d",k);
else
printf("Unsuccess!
");
/*插入*/
printf("\nNowwellinsert120after50...\n");
k=insertlink(h,50,120);/*下面在链表中值为50的结点后,插入一个值为120的结点*/
if(k!
=0)
{
printf("\nAfterofinsert,thelistis:
\n");
print(h);/*检查插入后的链表*/
}
else
printf("\nNotfountnodeof50!
");
/*删除*/
printf("\nInputthedatathatyouwanttodelete:
");
scanf("%d",&x);
deletelink(h,x);
printf("\nNowthelistis:
");
print(h);/*检查删除后的链表*/
getch();/*暂停,以便查看结果*/
}
参考程序运行结果:
实验二:
二叉树的创建与遍历实验
实验学时:
2
实验类型:
验证
实验要求:
必修
一、实验目的
通过本实验的学习,使学生主要练习二叉树的链表存储的实现及二叉树的基本操作,为继续学习后续章节图的内容奠定基础。
二、实验内容
(1)、二叉树的二叉链表结构的建立;
(2)、写一个二叉链表的创建算法,以此建立给定二叉树的二叉链表;
(3)、用递归方式写出二叉树的先序、中序、后序遍历算法,对上面建立的二叉链表进行遍历。
。
三、实验原理、方法和手段
链表存储二叉树通常具有两个指针域的链表作为二叉树的存储结构,其中每个结点由数据域Data、左指针域和右指针域组成。
两个指针域分别指向该结点的左、右孩子。
若某结点没有左孩子或右孩子,则对应的指针域为空。
最后,还需要一个链表的头指针指向根结点。
二叉树是非线性结构,遍历时是先访问根结点还是先访问子树,是先访问左子树还是先访问右子树必须有所规定,这就是遍历规则。
采用不同的遍历规则会产生不同的遍历结果,因此对二叉树进行遍历时,必须设定遍历规则。
根据遍历规则采用递归或者非递归的方式实现二叉树的遍历。
本实验通过创建算法,首先创建一个二叉链表,再采用递归方法对所创建链表进行先序、中序、后序遍历。
并以下面二叉树为例,对所设计算法进行验证。
四、实验组织运行要求
采用以学生自主训练为主的开放模式组织教学,教师予以答疑与指导。
五、实验条件
PC机一台、Windows操作系统、C++Builder软件或TurboC环境
六、实验步骤
(1)、将提前准备好的源程序录入计算机;
(2)、调试源程序,修正错误,记录实验数据;
(3)、分析运行结果,验证所编程序是否正确
七、思考题
(1)、结合二叉树的遍历,请考虑实现统计一棵二叉树的结点数的函数。
八、实验报告
(1)、实验预习:
仔细阅读实验指导书和教材中二叉树遍历的相关内容。
(2)、实验记录的内容应包括实验数据和运行结果。
(3)、实验结论部分的内容包括对实验结果的分析和总结,回答思考题。
参考程序:
#include"stdio.h"
typedefstructbnode
{
chardata;/*设结点内容的数据类型为字符型*/
structbnode*lchild,*rchild;
}Bnode,*BTree;
BTreeCreateBinTree(BTreet)
/*以加入空结点的先序序列输入,构造二叉链表*/
{
charch;
ch=getchar();
if(ch=='0')t=NULL;/*读入0时,将相应结点指针置空*/
else
{
t=(Bnode*)malloc(sizeof(Bnode));/*生成结点空间*/
t->data=ch;
t->lchild=CreateBinTree(t->lchild);/*构造二叉树的左子树*/
t->rchild=CreateBinTree(t->rchild);/*构造二叉树的右子树*/
}
return(t);
}
voidInOrder(BTreet)
/*中序遍历二叉树的递归算法*/
{
if(t)
{
InOrder(t->lchild);
printf("%c",t->data);
InOrder(t->rchild);
}
}
voidPostOrder(BTreet)
/*后序遍历二叉树的递归算法*/
{
if(t)
{
PostOrder(t->lchild);
PostOrder(t->rchild);
printf("%c",t->data);
}
}
main()
{
BTreet;
printf("Inputthetree,eg:
AB0D00CE00F00:
\n");
t=(Bnode*)malloc(sizeof(Bnode));
t=CreateBinTree(t);
printf("InOrder:
\n");
InOrder(t);
printf("\nPostOrder:
\n");
PostOrder(t);
printf("\n");
getch();
}
参考程序运行结果:
实验三:
图的邻接矩阵结构的创建和图的遍历
实验学时:
2
实验类型:
验证
实验要求:
必修
一、实验目的
通过本实验,使学生掌握图的基本存储方法,特别是图的邻接矩阵存储结构,学会图的邻接矩阵结构的创建。
掌握图的遍历算法,并在图的邻接矩阵结构下用高级语言实现。
二、实验内容
1、使用图的邻接矩阵存储结构,设计图的创建算法,并对给定的图,上机验证;
2、设计图的遍历算法,并用上面创建的图上机验证。
三、实验原理、方法和手段
图是一种非线性结构,图中任意两个顶点之间均可能存在关系。
邻接矩阵是图常用的一种存储结构,在这种存储结构中,我们用一维数组存储图中顶点的信息,用一个二维数组表示图中各顶点之间的邻接关系信息。
由于图的非线性结构自身的复杂性,在图中,没有一个“自然”的首结点,图中任意一个顶点都可作为第一个被访问的结点。
在非连通图中,从一个顶点出发,只能够访问它所在的连通分量上的所有顶点,因此,还需考虑如何选取下一个出发点以访问图中其余的连通分量。
如果图中存在回路,那么一个顶点被访问之后,有可能沿回路又回到该顶点。
图中一个顶点可以和其它多个顶点相连等问题。
确定了图的遍历操作的复杂性,图的遍历通常有深度优先搜索和广度优先搜索两种方式。
图的深度优先遍历的基本思想是从图中某个V0出发,访问此结点,再依次访问所有与V0有路径的结点。
完成后再另选图中一个未被访问的结点作始点,重复上述过程,直至图中所有结点都被访问到为止。
本实验通过创建算法,采用图的邻接矩阵结构首先创建一个图,再采用递归方法对所创建的图进行深度优先遍历。
四、实验组织运行要求
采用以学生自主训练为主的开放模式组织教学,教师予以答疑与指导。
五、实验条件
PC机一台、Windows操作系统、C++Builder软件或TurboC环境
六、实验步骤
(1)、将提前准备好的源程序录入计算机;
(2)、调试源程序,修正错误,记录实验数据;
(3)、分析运行结果,验证所编程序是否正确。
七、思考题
(1)、图的邻接矩阵表示法和图的邻接表的表示法的区别是什么?
(2)、图的广度优先遍历方法的实现是怎么样的?
八、实验报告
(1)、实验预习:
仔细阅读实验指导书和教材中图的相关内容,
(2)、实验记录的内容应包括源程序、实验数据和运行结果。
(3)、实验结论部分的内容应包括对实验结果的分析和总结,回答思考题。
参考程序:
#include
/*邻接矩阵存储结构的定义*/
#defineMaxVerNum30/*最大顶点个数*/
typedefstruct
{
charvexs[MaxVerNum];/*顶点表*/
intedges[MaxVerNum][MaxVerNum];/*邻接矩阵,即边表*/
intn,e;/*顶点数和边数*/
}MGraph;/*MGragh是以邻接矩阵存储的图类型*/
typedefenum{False,True}boolean;
booleanvisited[MaxVerNum];/*辅助变量,用于标记顶点是否被访问过信息*/
/*建立一个无向网图的邻接矩阵存储的算法*/
voidCreatGraph(MGraph*G)/*建立有向图G的邻接矩阵存储*/
{
inti,j,k;
printf("Inputvextersnumber&edgesnumber:
");
scanf("%d,%d",&(G->n),&(G->e));/*输入顶点数和边数*/
printf("Inputvextersinformation:
");
getchar();/*此句接收掉上一个输入的尾字符,保证下面输入的正确执行*/
for(i=0;i<(G->n);i++)/*输入顶点信息,建立顶点表*/
G->vexs[i]=getchar();
for(i=0;in;i++)/*初始化邻接矩阵*/
for(j=0;jn;j++)
G->edges[i][j]=0;
printf("Inputedgesinformation(i,j):
\n");
getchar();/*此句接收掉上一个输入的尾字符,保证下面输入的正确执行*/
for(k=0;ke;k++)/*输入e条边,建立邻接矩阵*/
{
scanf("%d,%d",&i,&j);
G->edges[i][j]=1;
G->edges[j][i]=1;
}
}
/*深度优先遍历算法*/
voidDFStraverse(MGraphG)
{
inti,v;
for(v=0;vvisited[v]=False;/*标志向量初始化*/
for(i=0;iif(!
visited[i])DFS(G,i);
printf("End\n");
}/*DFS*/
intDFS(MGraphG,intv)/*从第v个顶点出发深度优先遍历图G*/
{
intw;
printf("%c->",G.vexs[v]);
visited[v]=True;/*访问第v个顶点*/
/*下面对v尚未访问的邻接顶点w递归调用DFS*/
for(w=0;wif(G.edges[v][w]&&!
visited[w])DFS(G,w);
}
main()
{
MGraphG;
CreatGraph(&G);
DFStraverse(G);
getch();
}
以下图为例的测试结果:
实验四:
查找与排序实验
实验学时:
2
实验类型:
验证
实验要求:
必修
一、实验目的
查找与排序是计算机最频繁的操作,而排序与查找又是两个密切相关的技术,有效的数据组织可以提高查找的效率。
通过本实验,使学生加深对查找操作的基本概念、性质,内部排序操作的方法、特点的理解,培养学生利用查找和排序方面知识解决问题的能力,为后继课程的学习奠定基础。
二、实验内容
5、试编写一程序,用快速分类算法对下面数据表,按递增排序输出。
{49,2,19,25,36,5,72,60,41,52,28,10,44,37,14,32,8,76,81}
6、用二分法在分类后数据表中查找19和26,并输出查找信息。
写出各操作的实现函数,并上机验证。
三、实验原理、方法和手段
顺序查找的基本方法是从表的一端开始,顺序扫描数据表,依次将扫描到的结点关键字和给定值K相比较。
若当前扫描到的结点关键字与K相等,则查找成功;若扫描结束后,仍未找到关键字等于K的结点,则查找失败。
但顺序查找效率底,如果顺序表中的数据元素按关键字有序排列,则可进行二分查找。
在二分查找中,首先将待查值k和表中间位置上的结点关键字进行比较,若两者相等,则查找成功;否则,若k值小,则在表的前半部分中继续利用二分查找法查找,若k值大,则在表的后半部分中继续利用二分查找法查找。
这样,经过一次关键字比较就缩小一半的查找区间,如此进行下去,直到查找到该关键字或查找失败。
二分查找可以用递归方式和非递归方式来实现。
排序是将一个数据元素集合或序列重新排列成一个按数据元素某个项值有序的序列,通常是按照某种规则把数据的顺序重新整理。
排序方法各种各样,主要有插入排序、交换排序、选择排序、归并排序、基数排序等。
交换排序的方法是通过两两比较待排序记录的关键字,若不满足排序要求,则交换,不断重复比较和交换过程,直到待排序记录满足排序要求为止。
在交换排序中较为典型的是快速排序,其基本方法是在待排序列中任取一个记录,以它为基准用交换的方法将所有记录分成两部分,关键码值比它小的在一部分,关键码值比它大的在另一部分。
再分别对这两部分实施上述过程,一直重复到排序完成。
四、实验组织运行要求
采用以学生自主训练为主的开放模式组织教学,教师予以答疑与指导。
五、实验条件
PC机一台、Windows操作系统、C++Builder软件或TurboC环境
六、实验步骤
(1)、将提前准备好的源程序录入计算机;
(2)、调试源程序,修正错误,记录实验数据;
(3)、分析运行结果,验证所编程序是否正确。
七、思考题
(1)、试考虑折半查找的递归形式的算法。
(2)、如何改进快速分类算法,使得当分出的子数组已经排好序则不必再做。
八、实验报告
(1)、实验预习:
仔细阅读实验指导书,复习教材关于线性表部分的内容和C语言中关于指针的内容。
(2)、实验记录的内容应包括源程序、实验数据和运行结果。
(3)、实验结论部分的内容应包括对实验结果的分析和总结,回答思考题。
参考程序:
#include
#include
#defineMAXSIZE20/*顺序表的最大长度,假定顺序表的长度为20*/
typedefintKeyType;/*关键码类型为整数类型*/
typedefstruct
{
KeyTypekey;/*关键码项*/
}DataType;/*数据元素类型*/
typedefstruct
{
DataTyper[MAXSIZE+1];/*r[0]闲置或充当哨兵*/
intlength;/*顺序表长度*/
}SqList;/*顺序表类型*/
voidQuickSort(SqList*S,intlow,inthigh)
{/*对顺序表S中的序列r[1…length]作快速排序*/
intpivotkey;
intleft,pivotloc,right;
left=low;right=high;
if(low{
S->r[0].key=S->r[low].key;/*以子表的第一个记录作为支点(轴值)记录*/
pivotkey=S->r[low].key;/*取支点(轴值)记录关键字*/
while(low!
=high)/*从表的两端交替地向中间扫描*/
{
while(lowr[high].key>=pivotkey)
high--;
if(lowS->r[low++].key=S->r[hig