软件基础实验指导学生版.docx
《软件基础实验指导学生版.docx》由会员分享,可在线阅读,更多相关《软件基础实验指导学生版.docx(41页珍藏版)》请在冰豆网上搜索。
软件基础实验指导学生版
计算机软件基础实验指导书
-C语言实现
孙旭霞张晋辉薛旭
西安理工大学
自动化与信息工程学院
二0一一年六月
目录
实验大纲……………………………………...……………….……1
实验报告要求……………………………………...……………….3
实验一顺序表的基本操作………………………………………....4
实验二单链表的基本操作……………………………..……….….5
实验三堆栈的基本操作……………………………..…………….10
实验四循环队列的基本操作……………..…………..…………..14
实验五稀疏矩阵的转置………………………………....………...18
实验六二叉排序树的建立与遍历………………………..……….22
实验七直接插入排序………………………………………..…….24
实验八直接选择排序……………………………………..……….26
实验九顺序查找和折半查找……………………………………...28
实验十二叉排序树查找…………………………………..……….32
《计算机软件基础》课程实验教学大纲
一、制定实验教学大纲的依据
根据本校最新指定的《计算机软件基础》课程教学大纲制定
二、本课程实验教学在培养实验能力中的地位和作用
〈计算机软件基础〉课程主要研究计算机处理数据时数据的结构及其实现方法,是一门有关计算机软件知识及开发技术的专业基础课。
其主要任务是使学生深入了解计算机软件,正确选用与使用计算机软件,培养分析、设计新计算机软件的能力以及解决实际问题的能力。
实验课是本课程重要的教学环节,其目的是使学生掌握常用的数据结构的使用方法,接受编制基本程序技能的训练,提高学生编制复杂程序的能力。
三、应达到的实验能力标准
1、掌握线性表的概念、线性表的顺序存储结构、线性表的链式存储结构及其操作运算。
2、掌握堆栈和队列的概念、存储结构和操作运算的算法。
3、了解数组的定义和存储结构及其操作运算的算法,学会矩阵的压缩存储方式。
4、掌握二叉树的概念、性质及二叉树的遍历算法
5、掌握插入排序算法,选择排序算法和交换排序算法。
6、掌握顺序表的查找,树表的动态查找及哈希表查找算法。
四、学时、教学文件
学时:
本课程总学时为54学时,其中实验为22学时,占总学时的24.5%。
教学文件:
校编〈软件基础实验指导书〉;实验报告学生自拟。
要求学生实验前预习实验内容,按照每个实验任务要求画出软件流程图,编制相应的软件程序。
指导教师指导学生解决在调试程序中出现的问题,具体软件的测试数据由学生独立完成。
五、实验考核办法与成绩评定
实验课成绩占本课程总成绩20%,对无故缺勤三次以上实验者,本课程不予通过。
六、仪器设备及注意事项
仪器设备:
个人计算机
注意事项:
注意保护设备
七、实验项目的设置及学时分配
序号
实验项目及内容
学时
性质
要求
适用专业
1
顺序表的插入和删除
2
验证
必修
信息类,通信类,控制类
2
链表的插入和删除
2
设计
必修
同上
3
堆栈的插入和删除
2
验证
必修
同上
4
队列的插入和删除
2
验证
必修
同上
5
对称矩阵和三角矩阵的压缩存储
2
验证
必修
同上
6
二叉树的遍历
(前序遍历、中序遍历和后序遍历)
4
设计
必修
同上
7
插入排序和选择排序
2
验证
必修
同上
8
交换排序(冒泡排序和快速排序)
2
验证
必修
同上
9
顺序查找和二分查找
2
验证
必修
同上
10
二叉排序树查找
2
验证
必修
同上
共计
22
同上
实验报告要求
一、实验目的;
二、实验内容;
三、程序流程图;
四、设计部分程序;
五、实验结果(要求检测所有情况的正确性,写出测试条件及相应的测试结果);
六、完成思考题。
实验一顺序表的基本操作(2学时)
一、实验目的
了解顺序表的逻辑特征,掌握顺序表的描述方法、特点及有关的概念,掌握顺序表上的插入和删除等基本操作算法。
二、实验内容
在顺序表List[]中,实现顺序表的基本操作,包括:
初始化顺序表,在表中插入元素、删除元素。
基本要求:
(1)初始化顺序表;
(2)程序具有顺序表插入、删除和显示功能,可根据用户需要连续操作(插入、删除位置及要插入元素数值均从键盘输入);
(3)任一操作结束后将顺序表中的内容输出;
(4)程序能检测并提示发生上溢或下溢错误。
(5)可由用户选择退出程序。
三、实验要点及说明
顺序表又称为线性表的顺序存储结构,它是用一组地址连续的存储单元依次存放线性表的各个元素。
可按如下格式定义顺序表:
#defineMAXLEN10/*定义顺序表最大元素个数50*/
typedefintdatatype;
typedefstruct{
datatypeList[MAXLEN];/*定义顺序表List*/
intNum;/*定义顺序表表长(1~MAXLEN)*/
}Seqlist;
模块划分:
(1)initiq(Seqlist*la)函数:
初始化顺序表
操作前提:
la为未初始化线性表。
操作结果:
将la初始化为空表。
(2)insertq(la,i,e)函数:
实现插入功能
操作前提:
表la已存在,e为合法元素值,1≤i≤ListLength(la)+1。
操作结果:
在la中第i个位置插入新的数据元素e,la的长度加1。
(3)deleteq(la,i,e)函数:
实现删除功能
操作前提:
表la已存在且非空,1≤i≤ListLength(la)。
操作结果:
删除la的第i个数据元素,并用e返回其值,la的长度减1。
(4)print()函数:
实现输出功能
四、参考源程序
#include
#defineMAXLEN10
typedefintdatatype;
typedefstruct
{datatypeList[MAXLEN];
intNum;//Num:
1~MAXLEN
}Seqlist;
voidinitiq(Seqlist*la);
intinsertq(Seqlist*la,inti,datatypee);
intdeleteq(Seqlist*la,inti,datatype*e);
intprint(Seqlist*la);
voidmain()
{Seqlistla;
datatypee;
ints,n,i;/*s选择操作功能,i插入或删除数据的位置*/
printf("请输入你的选择:
1---initiate2---insert3---delete4---print5---exit\nyourchoice=");
scanf("%d",&s);
while(s!
=5)
{if(s==1)
{initiq(&la);
printf("完成初始化!
\n");}
elseif(s==2)
{printf("请输入待插入的数据位置:
");
scanf("%d",&i);
printf("请输入待插入的数据值:
");
scanf("%d",&e);
n=insertq(&la,i,e);
if(n!
=0)
print(&la);
}
elseif(s==3)
{printf("请输入待删除的数据位置:
");
scanf("%d",&i);
n=deleteq(&la,i,&e);
if(n!
=0)
{printf("已删除的数据为:
%d",e);
print(&la);
}
}
elseif(s==4)
print(&la);
else
printf("你的选择是错误的!
\n");
printf("请输入你的选择:
1---initiate2---insert3---delete4---print5---exit\nyourchoice=");
scanf("%d",&s);}}
/*初始化*/
voidinitiq(Seqlist*la)
{}
/*插入*/
intinsertq(Seqlist*la,inti,datatypee)/*i插入位置:
0~Num,*/
{}
/*删除*/
intdeleteq(Seqlist*la,inti,datatype*e)
{}
/*显示输出*/
intprint(Seqlist*la)
{intm;
if(la->Num<=0)
{printf("顺序表为空!
\n");
return0;}
else
{printf("当前的顺序表为:
\n");
for(m=0;mNum;m++)
printf("List[%d]=%d",m,la->List[m]);
printf("\n表长为%d\n",la->Num);
return1;}
}
五、思考题
1.在以上参考程序基础上,增加按数据元素值(key)前插入和删除功能。
2.设顺序表L中的数据元素按递增排列,编写一个算法,将数据元素x插入到顺序表L的适当位置上,以保持顺序表的有序性。
3.设计一算法实现删除顺序表a中第i个元素起的k个元素。
typedefstruct
{intdatatype[100];
intlength;/*顺序表的长度*/
}SqList;
4.设已有线性表la的数据结构定义同上,编写一个算法,删除顺序表la中所有值为x的数据元素。
5.编写一个算法,实现将两个不同的顺序表复制到一个顺序表中。
实验二单链表的基本操作(2学时)
一、实验目的
了解链表的逻辑结构特征,掌握链表的描述方法、特点及有关概念,掌握链表的建立、插入、删除以及查找的基本操作算法。
二、实验内容
实现单链表的基本操作,包括:
建立单链表,插入结点,删除结点,查找结点,打印输出单链表中的所有结点。
基本要求:
(1)初始化单链表;
(2)程序具有单链表插入、删除和显示功能,可根据用户需要连续操作(插入位置、插入结点的数据及被删除结点的数据要从键盘输入);
(3)根据键盘输入的数据在单链表中查找结点;
(4)任一操作结束后将单链表中的内容输出;
(5)可由用户选择退出程序。
三、实验要点及说明
线性表的链式存储结构是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接的次序实现的。
线性表的链式存储结构中只有一个指针域的链表称为单链表。
可按如下格式定义单链表的结点结构:
typedefstructnode
{datatypedata;/*结点数据域*/
structnode*next;/*结点指针域*/
}slnode;
划分各功能模块:
(1)initiate(slnode**h)函数:
初始化单链表
(2)intCreat1(slnode*h,intn)函数:
建立单链表
(3)insert(slnode*h,inti,datatypex)函数:
在带头结点的单链表h中第i个位置前插入新结点x。
(4)delete(slnode*h,inti)函数:
删除第i个位置的结点
(5)search(slnode*h,inti)函数:
查找第i个位置结点的值。
(6)print(slnode*h)函数:
显示输出单链表中的所有结点。
四、参考源程序
#include
#include
#include
typedefintdatatype;
typedefstructnode
{datatypedata;
structnode*next;
}slnode;
//intl;/*保存查找到的结点位置*/
intinitiate(slnode**h);
intCreat1(slnode*h);
intinsert(slnode*h,inti,datatypex);
intdeletet(slnode*h,inti,datatype*x);
slnode*search(slnode*h,datatypex);
voidprint(slnode*h);
voidmain()
{slnode*h,*s;
intsel,state,x,i;/*sel操作选择,x要查找的结点数据,i结点位置*/
//initiate(&h);
printf("请输入你的选择:
1---initiate2---Creat3---insert4---delete5---search6---print7---exit\nyourchoice=");
scanf("%d",&sel);
while(sel!
=1)
{printf("先进行初始化操作\n");
printf("请输入你的选择:
1---initiate2---Creat3---insert4---delete5---search6---print7---exit\nyourchoice=");
scanf("%d",&sel);
}
while(sel!
=7)
{if(sel==1)
{if(state=initiate(&h)==0)
printf("操作失败");}
elseif(sel==2)
{if(state=Creat1(h)==1)
print(h);
else
printf("操作失败");}
elseif(sel==3)
{printf("请输入待插入的结点位置:
");
scanf("%d",&i);
printf("请输入待插入的结点值:
");
scanf("%d",&x);
if(state=insert(h,i,x)==1)
print(h);
else
printf("操作失败\n");}
elseif(sel==4)
{printf("请输入待删除结点的位置:
");
scanf("%d",&i);
if(state=deletet(h,i,&x)==1)
{printf("被删除结点值:
%d\n",x);
print(h);}
else
printf("操作失败\n");}
elseif(sel==5)
{printf("请输入要查找的结点数据:
");
scanf("%d",&x);
s=search(h,x);
if(s!
=NULL)
printf("查找成功,结点位置为:
%d\n",s->data);
else
printf("操作失败\n");
}
elseif(sel==6)
{print(h);}
else
printf("你的选择是错误的!
\n");
printf("请输入你的选择:
1---initiate2---Creat3---insert4---delete5---search6---print7---exit\nyourchoice=");
scanf("%d",&sel);}}
/*初始化*/
intinitiate(slnode**h)
{}
/*建立单链表*/
intCreat1(slnode*h)
{}
/*插入*/
intinsert(slnode*h,inti,datatypex)/*i插入结点的位置*//*x插入结点的数据*/
{}
/*删除*/
intdeletet(slnode*h,inti,datatype*x)/*x存放被删除结点的数据*/
{}
/*查找*/
slnode*search(slnode*h,datatypex)
{}
/*显示输出*/
voidprint(slnode*h)
{slnode*p;
inti;
p=h->next;
i=0;
printf("\n当前的单链表数据内容为:
\n");
while(p!
=NULL)
{i++;
printf("第%d个数据:
%d\n",i,p->data);
p=p->next;}
printf("\n线性表的表长为%d\n",i);}
五、思考题
1.在以上参考程序基础上,增加按数据元素值(key)前插入和删除功能。
2.编写一个算法,删除单链表中值相同的多余结点。
3.实现单链表的就地逆序,设其头结点指针为head,编写一个算法将单链表逆置,即最后一个结点变成第一个结点,原来倒数第二个结点变成第二个结点,如此等等。
4.假设现有一个带头结点的单链表head,试写出将单链表中结点数据值为偶数的结点,复制并放入另一个带头结点的单链表head1的头部的算法。
5.设现有一个带头结点的单链表(头指针为head),试写出一算法,删除该单链表中数据为奇数的所有结点。
6.修改print(slnode*h)函数,使其显示输出单链表中的所有结点的数据域和地址域。
实验三堆栈的基本操作(2学时)
一、实验目的
了解堆栈的顺序逻辑结构特征,掌握堆栈的描述方法、特点及有关概念,掌握堆栈的建立、插入、删除等基本操作算法。
二、实验内容
实现顺序堆栈的基本操作,包括:
初始化堆栈,进栈,出栈,取栈顶元素。
基本要求:
(1)顺序堆栈的元素个数可随意设定;
(2)可连续测试任意多个元素的进栈、出栈操作;
(3)可实现取栈顶元素;
(4)任一操作结束后将顺序堆栈中的内容输出;
(5)可由用户选择退出程序。
三、实验要点及说明
栈的逻辑结构和线性表相同,但运算规则与线性表相比有了更多的限制,故又称操作受限的线性表。
栈是一种只允许在表的一端进行插入或删除操作的线性表。
只允许插入,删除操作的一端称为栈顶,另一端称为栈底,栈顶当前位置是由一个栈顶指示器指示;插入操作称为进栈或入栈,删除操作称为出栈或退栈;当栈中没有任何元素时称为空栈。
可按如下格式定义堆栈的顺序存储结构:
#defineMAX10/*定义顺序堆栈最大元素个数*/
typedefstruct
{datatypestack[MAX];/*定义顺序堆栈stack*/
inttop;/*定义栈顶指示器*/
}seqstack;
模块划分:
(1)initiate()函数:
初始化顺序堆栈
(2)push()函数:
进栈操作
(3)pop()函数:
出栈操作
(4)stacktop()函数:
取栈顶元素
(5)print()函数:
显示输出栈内元素
四、参考源程序
#include
#include
#defineMAX10
typedefintdatatype;
typedefstruct
{datatypestack[MAX];
inttop;
}seqstack;
voidinitiate(seqstack*s);
intpush(seqstack*s,datatypex);
intpop(seqstack*s,datatypex);
intstacktop(seqstack*s);
voidprint(seqstack*s);
intmain()
{seqstack*s;
intsel,state;/*sel选择输入,state进栈或出栈数据成功与否的标志*/
datatypex;
if((s=(seqstack*)malloc(sizeof(seqstack)))==NULL)
{printf("申请空间错误!
\n");
return0;}
initiate(s);
printf("完成初始化!
\n");
printf("请输入你的选择:
1---initiate2---push3---pop4---stacktop5---print6---exit\nyourchoice=");
scanf("%d",&sel);
while(sel!
=6)
{if(sel==1)
{initiate(s);
printf("完成重新初始化!
\n");}
elseif(sel==2)
{printf("请输入待进栈的数据值:
");
scanf("%d",&x);
if(state=push(s,x)==1)
print(s);
else
printf("进栈失败!
\n");
}
elseif(sel==3)
{
if(state=pop(s,x)==1)
print(s);
else
printf("出栈失败!
\n");
}
elseif(sel==4)
{if(state=stacktop(s)==1)
print(s);
else
printf("取栈顶元素失败!
\n");
}
elseif(sel==5)
{print(s);}
else
printf("你的选择是错误的!
\n");
printf("请输入你的选择:
1---initiate2---push3---pop4---stacktop5---print6---exit\nyourchoice=");
scanf("%d",&sel);}
return1;}
/*初始化*/
voidinitiate(seqstack*s)
{}
/*进栈*/
intpush(seqstack*s,datatypex)
{}
/*出栈*/
intpop(seqstack*s,datatypex)
{}
/*取栈顶元素*/
intstacktop(seqstack*s)
{}
/*显示输出*/
voidprint(seqstack*s)
{inti;
if(s->top==-1)
printf("栈