数据结构实验指导 答案.docx
《数据结构实验指导 答案.docx》由会员分享,可在线阅读,更多相关《数据结构实验指导 答案.docx(49页珍藏版)》请在冰豆网上搜索。
数据结构实验指导答案
《数据结构》实验教学指导书
目录
实验一熟悉C语言5
实验二线性表9
实验三栈14
实验四串17
实验五数组和广义表20
实验六树的操作(二叉树及其先序遍历)24
实验七图的操作(邻接表的建立)28
实验八排序33
二、适用专业及年级
教育技术学
三、课程目标与基本要求
本课程学习的目的是使学生学会分析研究计算机加工的数据结构的特性,以便为应用涉及的数据选择适当的逻辑结构、存储结构及相应的算法,并初步了解对算法的时间分析和空间分析技术。
要求学生了解数据结构及其分类、数据结构与算法的密切关系;熟悉各种基本数据结构及其操作,学会根据实际问题要求来选择数据结构;掌握设计算法的步骤和算法分析方法;掌握数据结构在排序等常用算法中的应用。
通过上机实践训练,培养学生的数据抽象能力和程序设计的能力。
四、主要仪器设备
386以上微机TurboC2.0或Win-TC
五、实验项目及教学安排
序号
实验项目名称
实验基本方法和内容
项目
学时
项目
类型
每组
人数
教学要求
1
熟悉C语言
使用C语言编程语言环境;自主设计、编译一基本C语言程序。
2
基础
1
必修
2
线性表
利用顺序及链式存储实现线性表,并实现其基本操作。
2
基础
1
必修
3
栈
利用顺序或链式存储实现栈,并实现其基本操作。
利用堆栈完成表达式求值的算法操作。
2
基础
1
必修
4
串
建立串的数据类型,并实现其基本操作。
完成串的文本模式匹配算法。
2
基础
1
必修
5
数组和广义表
建立数组的存储结构,并实现其基本操作。
2
基础
1
必修
6
树的操作
建立树的数据类型并实现其基本操作;实现二叉树的建立、遍历、输出查找、更新、插入、删除等算法。
实现哈夫曼树及其操作。
2
基础
1
必修
7
图的操作
实现图及其操作;实行图的深度、广度遍历算法;实现最短路径算法,拓扑排序算法。
实现AOE网关键路径。
2
基础
1
必修
8
排序
实现插入和选择排序算法;实现交换和归并排序算法。
2
综合
1
必修
六、考核方式及成绩评定
考核方式
1、实验平时成绩:
(1)实验考勤:
每次考勤分出勤(2分);请假、迟到、早退(1分);旷课(0分)记分。
(2)预习报告:
要求写明实验目的、主要实验设备名称、实验原理和内容。
分优秀(4分)、良好(3分)、中等(2分)、及格(1分)和不及格(0分)记分。
(3)实验报告:
要求写明实验设备名称和型号、实验步骤、实验分析及注意事项。
分优秀(4分)、良好(3分)、中等(2分)、及格(1分)和不及格(0分)记分。
实验平时成绩最后折算成100分。
2、实验考试:
上机考试,满分为100分。
成绩评定:
总实验成绩占本课程成绩的20%。
总实验成绩=实验平时成绩×50%+实验考试成绩×50%。
实验一熟悉C语言
一、实验目的
1.复习C语言中数组的使用
2.复习C语言中指针的使用
3.复习C语言中结构体的使用
二、实验内容
1.学习C语言数组示例,写出程序结果
2.学习C语言指针示例,写出程序结果
3.学习C语言结构体示例,写出程序结果
三、实验实例
数组示例:
#include"stdio.h"
#defineN4
main()
{
inti,j,k,a[N];
printf("Pleaseinput4numbers:
\n");
for(i=0;iscanf("%d",&a[i]);
for(i=N-1;i>1;i--)
{
for(j=1;j<=i;j++)
{
if(a[j-1]>a[j])
{
k=a[j-1];a[j-1]=a[j];a[j]=k;
}
}
}
for(i=0;iprintf("\n");
}
思考题:
说出上述程序的功能
指针示例1:
#include
main()
{
int a,b;
int *point_1,*point_2,*temp_point;
scanf("%d,%d",&a,&b);
point_1=&a;
point_2=&b;
if (a
{
temp_point=point_1;
point_1=point_2;
point_2=temp_point;
}
printf("%d,%d",*point_1,*point_2);
}
指针示例2:
#include
main()
{
int a,b;
int *point_1,*point_2;
scanf("%d,%d",&a,&b);
point_1 = &a;
point_2 = &b;
compositor(point_1,point_2);
printf("%d,%d",a,b);
}
static compositor(p1,p2)
int *p1,*p2;
{
int temp;
if (*p1<*p2)
{
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
}
思考题:
比较指针示例1和指针示例2说出他们的区别,并分别说出他们的功能
结构体例子:
#include"stdio.h"
structstudent
{charnum[6];//学生编号
charname[8];//学生姓名
intscore[3];//学生三门课程分数
floatavr;
}stu[5];//共有五个学生
main()
{inti,j,sum;
/*input*/
for(i=0;i<5;i++)
{printf("\npleaseinputNo.%dscore:
\n",i);
printf("stuNo:
");
scanf("%s",stu.num);
printf("name:
");
scanf("%s",stu.name);
sum=0;
for(j=0;j<3;j++)
{printf("score%d.",j+1);
scanf("%d",&stu.score[j]);
sum+=stu.score[j];
}
stu.avr=sum/3.0;
}
}
思考题:
这是关于学生成绩运算的一个结构体函数,写出函数功能
四、实验报告要求
1.上机前完成所有的函数编写
2.主要实验设备(软件)部分填写:
装有Win—TC软件的普通PC机
3.实验记录部分填写编写主函数调用所写所有函数的屏幕输出
4.设备名称填写PC机,型号可空,编号填写所使用计算机编号,运行情况填写良好
5.实验总结部分填写对该次实验所编写函数的运行情况,和在实验过程中对线性表的认识和实现情况
实验一(附)熟悉C语言
一、实验目的
1.复习C语言中数组的使用
2.复习C语言中指针的使用
3.复习C语言中结构体的使用
二、实验内容
1.编写C语言函数,完成输出九九乘法表(提示:
使用二维数组完成)
2.编写C语言函数,使用指针完成一个二十位整型数组的遍历,并将数组中的各位分别增1
注意:
若对C语言比较熟悉,可进行实验一(附)中的实验项目编写,若不熟悉,则可完成对实验一中问题的回答
实验二线性表
一、实验目的
1.掌握实现线性表的基本操作方法;
2.掌握线性表的基本操作:
建表,插入,删除,输出等运算在顺序存储结构和链式存储结构上的实现.
通过本次实习加深对高级语言C语言的使用(特别是函数参数、指针类型、链表的使用).熟悉线性表的基本运算在两种存储结构(顺序结构和链式结构)上的实现
二、实验内容
1.编写生成线性表的函数,线性表的元素从键盘输入,分别使用顺序和链式存储结构存储;
2.编写在线性表中插入一元素的函数;
3.编写在线性表中删除一元素的函数;
4.编写输出线性表的函数;
5.编写主函数,调用以上各函数,以便能观察出原线性表以及作了插入或删除后线性表的屏幕输出.
三、实验报告要求
6.上机前完成所有的函数编写
7.主要实验设备(软件)部分填写:
装有Win—TC软件的普通PC机
8.实验记录部分填写编写主函数调用所写所有函数的屏幕输出
9.设备名称填写PC机,型号可空,编号填写所使用计算机编号,运行情况填写良好
10.实验总结部分填写对该次实验所编写函数的运行情况,和在实验过程中对线性表的认识和实现情况
四、实验原理
(一)线性表是最常用的而且也是最简单的一种数据结构,线性表是N个数据元素的有限序列。
例如26个英文元素的字母表:
(A,B,C,D,···)。
其数据结构的描述为:
Linear_list=(D,R)其中:
D={ai|ai属于D0,i=1,2,3,···}R={N},N={|i=2,3,4,···}。
本实验是以数组的形式把有序表存放在计算机内存的一个连续的区域内,这样便有:
LOC(ai+1)=LOC(ai)+m。
其中m是存放每个元素所占的内存字数。
LOC(ai)=LO+m·(i-1)。
其中LO是ai的地址,即首地址。
(二)实验程序说明
插入一个新元素到第i个位置,既把元素ai向后移一个位置,成为元素ai+1,把新元素放入到第i个位置,其他元素依次后移。
存一新元素到第i个位置是把元素ai冲掉后存上新值。
删除第i个元素就是把余后的元素依次向前移一个位置。
即:
以元素ai+1,ai+2,···,依次取代ai,ai+1,···。
删除后的表长是n-1(n是原表长)。
三、程序流程图
五、参考程序
#include"stdio.h"
#include"conio.h"
#defineMaxLine100/*顺序存储的最大个数*/
typedefintElemType;
typedefstruct
{
ElemTypedata[MaxLine];/*存放顺序表的数组*/
intlength;/*顺序表的长度*/
}SqList,*L;
/*初始化顺序表*/
voidInitList(SqList*L)
{
L->length=0;
}
/*得到顺序表的长度*/
intGetLength(SqList*L)
{
returnL->length;
}
/*得到顺序表中的第i个元素*/
ElemTypeGetElem(SqList*L,inti)
{
if(i<1||i>L->length)
{
printf("error");
exit
(1);
}
returnL->data[i-1];
}
voidListInsert(SqList*L,inti,ElemTypex)
/*添加线性表中第i个位置上的元素,i从1开始*/
{
intj;
if(i<1||i>L->length+1)/*检查添加位置的合法性*/
{
printf("error");
exit
(1);
}
if(L->length==MaxLine)
{
printf("overflow!
");
exit
(1);
}
j=L->length;
while(j{
L->data[j]=L->data[j-1];
j--;
}
L->data[i-1]=x;
L->length++;
}
voidListDelete(SqList*L,inti)/*删除线性表中第i个位置上的元素*/
{
intj;
if(i<1||i>L->length)/*检查空表及删除位置的合法性*/
{
printf("不存在第i个元素");
exit(0);
}
for(j=i;j<=L->length-1;j++)
L->data[j-1]=L->data[j];/*向前移动元素*/
L->length--;
}
main()
{
SqList*L;
intt=1,d=1;
ElemTypedata;
InitList(L);
for(t=1;t<=8;t++)
{
printf("Pleaseinputthe%dthlistelem:
",t);
scanf("%d",&d);
ListInsert(L,t,d);
}
printf("thelengthofListis%d\n",GetLength(L));
data=GetElem(L,1);
printf("%d\n",data);
printf("%d\n",GetLength(L));
ListDelete(L,1);
data=GetElem(L,1);
printf("%d\n",data);
printf("%d\n",GetLength(L));
getch();
}
六、实验步骤
1.参考实验程序自己编出程序,上机调试。
2.对调试好的程序进行以下实验
七、思考题
1.有序表,有哪些显著的特点和优点?
实验三栈
一、实验目的
1.掌握实现栈的基本操作方法
2.掌握栈的基本操作:
建栈,Push,Pop等运算在顺序存储结构上的实现
通过本次实习加深对高级语言C语言的使用,熟悉串的基本运算顺序结构上的实现
二、实验内容
1.编写生成栈的函数,栈的元素从键盘输入
2.编写在栈中压入一个元素的函数
3.编写在栈中弹出一个元素的函数
4.编写主函数,调用以上各函数,以便能观察出各函数的屏幕输出。
三、实验报告要求
1.上机前完成所有的函数编写
2.主要实验设备(软件)部分填写:
装有Win—TC软件的普通PC机
3.实验记录部分填写编写主函数调用所写所有函数的屏幕输出
4.设备名称填写PC机,型号可空,编号填写所使用计算机编号,运行情况填写良好
5.实验总结部分填写对该次实验所编写函数的运行情况,和在实验过程中对栈的认识和实现情况
四、参考程序
#include"stdio.h"
#include"conio.h"
#defineMaxSize100/*栈中的元素的最大个数*/
typedefintElemType;
typedefstruct
{
ElemTypedata[MaxSize];/*存放堆栈的数组*/
inttop;/*栈顶元素*/
}Stack,*S;
/*堆栈的初始化*/
voidInitStack(Stack*S)
{
/*指向的是最顶端的元素
取值范围为从0~MaxSize-1
为-1时说明为空栈*/
S->top=-1;
}
/*判栈空操作*/
intStackEmpty(Stack*S)
{
return(S->top==-1?
1:
0);
}
/*压栈操作*/
voidPush(Stack*S,ElemTypex)
{
inti;
if(S->top==MaxSize-1)
{
printf("Stackisfull");
exit
(1);
}
/*elseS->data[++S->top]=x;*/
else
{
S->top=S->top+1;
i=S->top;
S->data[i]=x;
}
}
/*出栈操作*/
intPop(Stack*S)
{
inti;
if(StackEmpty(S))
{
printf("\nStackisfree!
");
return0;
}
else
{
i=S->data[S->top];
S->top--;
returni;
}
}
/*栈长度操作*/
intGetLength(Stack*S)
{
returnS->top+1;
}
/*取栈顶操作*/
intGetTop(Stack*S)
{
if(StackEmpty(S))
{
printf("\nStackisfree");
return0;
}
else
{
if(GetLength(S))
return0;
else
returnS->data[S->top];
}
}
main()
{
Stack*S;
inti,j,e,result;
InitStack(S);
for(i=1;i<=2;i++)
{
scanf("%d",&e);
Push(S,e);
}
printf("Thenumberofelemis:
%d",GetLength(S));
e=Pop(S);
printf("\nAfterapop,Thenumberofelemis:
%d",GetLength(S));
printf("\n%d",e);
for(i=0;i<10;i++)
printf("\n%d",GetTop(S));
getch();
}
五、实验步骤
1.参考实验程序自己编出程序,上机调试。
2.对调试好的程序进行以下实验
实验四串
一、实验目的
1.熟悉串类型的实现
2.掌握串的模式匹配算法
通过本次实习加深对高级语言C语言的使用,熟悉串的基本运算顺序结构上的实现
二、实验内容
1.利用C语言提供的关于串类型的操作;
2.使用简单算法或KMP算法实现模式匹配算法
三、实验报告要求
1.上机前完成所有的函数编写
2.主要实验设备(软件)部分填写:
装有Win—TC软件的普通PC机
3.实验记录部分填写编写主函数调用所写所有函数的屏幕输出
4.设备名称填写PC机,型号可空,编号填写所使用计算机编号,运行情况填写良好
5.实验总结部分填写对该次实验所编写函数的运行情况,和在实验过程中对串的认识和实现情况
四、参考程序
#include
#include
/*得到数组的长度*/
intstrLen(char*s)
{
inti=0;
while(s[i]!
='\0')
{
i++;
}
returni;
}
/*简单模式匹配算法*/
intIndex(char*S,char*T,intpos)
{
/*存放比较的总次数*/
inttimes=0;
inti=pos-1,j=0;
intsLen=strLen(S);
inttLen=strLen(T);
while(i{
times++;
if(S[i]==T[j]){i++;j++;}/*继续比较后续字符*/
else{i=i-j+1;j=0;}/*指针后退重新比较*/
}
printf("thetimesthatcomparesare%d\n",times);
if(j>=tLen)
{
returni-tLen+1;
}
elsereturn0;
}
/*KMP算法*/
intIndex_KMP(char*S,char*T,intpos)
{
inti=pos,j=1;
intt;
intsLen=strLen(S);
inttLen=strLen(T);
/*存放比较的总次数*/
inttimes=0;
charnext[100]="";
GetNext(T,next);
/*打印next数组值*/
for(t=1;t<=tLen;t++)
{
printf("%d",next[t]);
}
printf("\n");
while(i{
times++;
if(j==0||S[i]==T[j]){i++;j++;}
/*继续比较后续字符*/
elsej=next[j];/*子串向右移动*/
}
printf("thetimesthatcomparesare%d\n",times);
if(j>=tLen)returni-tLen+1;/*匹配成功*/
elsereturn0;
}
/*得到next数组值*/
intGetNext(char*T,char*next)
{
inti=1,j=0;
inttLen=strLen(T);
next[1]=0;
while(i{
if(j==0||T[i]==T[j])
{
++i;
++j;
next[i]=j;
}
elsej=next[j];
}
return1;
}
voidmain()
{
chars[]="aaaaaaaaaaaaaaaaaaaaaab";
chart[]="aaaab";
inti,pos;
pos=2;
i=Index(s,t,pos);
printf("thepositionofsubStringis%d\n",i);
i=Index_KMP(s,t,pos);
printf("thepositionofsubStringis%d\n",i);
getch();
}
五、实验步骤
1.参考实验程序自己编出程序,上机调试。
2.对调试好的程序进行以下实验
六、思考题
1.KMP算法实现模式匹配什么时候比简单算法实现模式匹配效率更高?
实验五数组和广义表
一、实验目的
6.熟悉数组类型的实现
7.掌握使用数组实现特殊矩阵的压缩存储
8.掌握稀疏矩阵的三元组表示法的实现
通过本次实习加深对高级语言C语言的使用,熟悉数组在C语言中的实现
二、实验内容
5.利用C语言提供的关于数组的操作,完成对称矩阵的压缩存储,并能够在压缩存储的数组中根据矩阵上某结点的下标得到此结点的值
6.定义矩阵的三元组表示结构,用三元组表示法来实现矩阵的转置运算
三、实验报告要求
11.上机前完成所有的函数编写
12.实验名称:
数组和广义表
13.实验目的:
同一
14.实验内容:
同二,另在此部分中将课前编写的算法写上,