软件基础实验指导学生版.docx

上传人:b****5 文档编号:5758623 上传时间:2023-01-01 格式:DOCX 页数:41 大小:43.76KB
下载 相关 举报
软件基础实验指导学生版.docx_第1页
第1页 / 共41页
软件基础实验指导学生版.docx_第2页
第2页 / 共41页
软件基础实验指导学生版.docx_第3页
第3页 / 共41页
软件基础实验指导学生版.docx_第4页
第4页 / 共41页
软件基础实验指导学生版.docx_第5页
第5页 / 共41页
点击查看更多>>
下载资源
资源描述

软件基础实验指导学生版.docx

《软件基础实验指导学生版.docx》由会员分享,可在线阅读,更多相关《软件基础实验指导学生版.docx(41页珍藏版)》请在冰豆网上搜索。

软件基础实验指导学生版.docx

软件基础实验指导学生版

计算机软件基础实验指导书

-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("栈

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

当前位置:首页 > 经管营销 > 生产经营管理

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

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