数据结构实验指导文档格式.docx
- 文档编号:21526199
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:55
- 大小:44.17KB
数据结构实验指导文档格式.docx
《数据结构实验指导文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构实验指导文档格式.docx(55页珍藏版)》请在冰豆网上搜索。
return1;
}
intmain(){/*输出100以内所有素数*/
inti;
printf("
\n"
);
for(i=2;
i<
100;
i++)
if(isprime(i)==1)printf("
%4d"
i);
return0;
运行结果:
2357111317192329313741434753596167717379838997Pressanykeytocontinue
2、调试程序:
对一维数组中的元素进行逆序排列。
#defineN10
intmain(){
inta[N]={0,1,2,3,4,5,6,7,8,9},i,temp;
\ntheoriginalArrayis:
\n"
for(i=0;
N;
printf("
a[i]);
N/2;
i++){/*交换数组元素使之逆序*/
temp=a[i];
a[i]=a[N-i-1];
a[N-i-1]=temp;
}
\nthechangedArrayis:
theoriginalArrayis:
0123456789
thechangedArrayis:
9876543210Pressanykeytocontinue
3、调试程序:
在二维数组中,若某一位置上的元素在该行中最大,而在该列中最小,则该元素即为该二维数组的一个鞍点。
要求从键盘上输入一个二维数组,当鞍点存在时,把鞍点找出来。
#defineM3
#defineN4
inta[M][N],i,j,k;
\n请输入二维数组的数据:
M;
for(j=0;
j<
j++)
scanf("
%d"
&
a[i][j]);
i++){/*输出矩阵*/
printf("
a[i][j]);
i++){
k=0;
for(j=1;
j++)/*找出第i行的最大值*/
if(a[i][j]>
a[i][k])
k=j;
j++)/*判断第i行的最大值是否为该列的最小值*/
if(a[j][k]<
break;
if(j==M)/*在第i行找到鞍点*/
%d,%d,%d\n"
a[i][k],i,k);
请输入二维数组的数据:
122
145
456
789
1221
4545
6789
2,0,1
Pressanykeytocontinue
4、调试程序:
利用指针输出二维数组的元素。
inta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
int*p;
for(p=a[0];
p<
a[0]+12;
p++){
if((p-a[0])%4==0)printf("
*p);
1357
9111315
17192123Pressanykeytocontinue
5、调试程序:
设有一个教师与学生通用的表格,教师的数据有姓名、年龄、职业、教研室四项,学生有姓名、年龄、专业、班级四项,编程输入人员的数据,再以表格输出。
#include<
structstudent{
charname[8];
/*姓名*/
intage;
/*年龄*/
charjob;
/*职业或专业,用s或t表示学生或教师*/
union{
intclass;
/*班级*/
charoffice[10];
/*教研室*/
}depa;
}stu[N];
intn;
printf(“\n请输入人员数(<
10):
\n”);
scanf(“%d”,&
n);
n;
i++){/*输入n个人员的信息*/
\n请输入第%d人员的信息:
(nameagejobclass/office)\n"
i+1);
scanf("
%s,%d,%c"
stu[i].name,&
stu[i].age,&
stu[i].job);
if(stu[i].job==’s’)
stu[i].depa.class);
else
scanf("
%s"
stu[i].depa.office);
printf(“nameagejobclass/office”);
i++){/*输出*/
%s%3d%3c%d\n"
stu[i].name,stu[i].age,stu[i].job,stu[i].depa.class);
%s%3d%3c%s\n"
stu[i].name,stu[i].age,stu[i].job,stu[i].depa.office);
输入的数据:
2
Wang19s99061
Li36tcomputer
请输入人员数(<
请输入第1人员的信息:
(nameagejobclass/office)
请输入第2人员的信息:
nameagejobclass/officeWang0
四、实验小结
这一小结试验主要的目标是复习,复习包括结构体,共用体,数组,指针的概念,让大家更熟练的操作《C语言程序设计教程》一书中的知识,并对其系统的运用有一个更好的掌握。
通过这一个试验,我们能更好的运用C语言知识设计一些比较简单的程序,并且在C++环境中能顺利的运行得到想要的结果。
能把一个程序设计的问题通过几种不同的函数以及设计方法得到相同的结果,并且合理的说出其内存利用率的大小(分空间利用率和时间利用率)。
比较其优劣。
五、教师评语
实验一顺序表与链表
1、掌握线性表中元素的前驱、后续的概念。
2、掌握顺序表与链表的建立、插入元素、删除表中某元素的算法。
3、对线性表相应算法的时间复杂度进行分析。
4、理解顺序表、链表数据结构的特点(优缺点)。
说明以下概念
1、线性表:
2、顺序表:
3、链表:
是指将若干数组(每一个数组称为一个“结点”)按一定规则连接起来的数据结构。
1、阅读下面程序,在横线处填写函数的基本功能。
并运行程序,写出结果。
malloc.h>
#defineERROR0
#defineOK1
#defineINIT_SIZE5/*初始分配的顺序表长度*/
#defineINCREM5/*溢出时,顺序表长度的增量*/
typedefintElemType;
/*定义表元素的类型*/
typedefstructSqlist{
ElemType*slist;
/*存储空间的基地址*/
intlength;
/*顺序表的当前长度*/
intlistsize;
/*当前分配的存储空间*/
}Sqlist;
intInitList_sq(Sqlist*L);
/*判断顺序表长度是否为0*/
intCreateList_sq(Sqlist*L,intn);
/*输入顺序表中的元素*/
intListInsert_sq(Sqlist*L,inti,ElemTypee);
/*输出顺序表中某个元素的内存地址*/
intPrintList_sq(Sqlist*L);
/*输出顺序表的元素*/
intListDelete_sq(Sqlist*L,inti);
/*删除第i个元素*/
intListLocate(Sqlist*L,ElemTypee);
/*查找值为e的元素*/
intInitList_sq(Sqlist*L){
L->
slist=(ElemType*)malloc(INIT_SIZE*sizeof(ElemType));
if(!
L->
slist)returnERROR;
length=0;
listsize=INIT_SIZE;
returnOK;
}/*InitList*/
intCreateList_sq(Sqlist*L,intn){
ElemTypee;
inputdata%d"
e);
ListInsert_sq(L,i+1,e))
returnERROR;
}/*CreateList*/
/*输出顺序表中的元素*/
intPrintList_sq(Sqlist*L){
for(i=1;
=L->
length;
%5d"
L->
slist[i-1]);
}/*PrintList*/
intListInsert_sq(Sqlist*L,inti,ElemTypee){
intk;
if(i<
1||i>
length+1)
returnERROR;
if(L->
length>
listsize){
slist=(ElemType*)realloc(L->
slist,
(INIT_SIZE+INCREM)*sizeof(ElemType));
slist)
listsize+=INCREM;
for(k=L->
length-1;
k>
=i-1;
k--){
slist[k+1]=L->
slist[k];
slist[i-1]=e;
length++;
}/*ListInsert*/
/*在顺序表中删除第i个元素*/
intListDelete_sq(Sqlist*L,inti){
/*在顺序表中查找指定值元素,返回其序号*/
intListLocate(Sqlist*L,ElemTypee){
Sqlistsl;
intn,m,k;
pleaseinputn:
"
/*输入顺序表的元素个数*/
if(n>
0){
\n1-CreateSqlist:
InitList_sq(&
sl);
CreateList_sq(&
sl,n);
\n2-PrintSqlist:
PrintList_sq(&
\npleaseinputinsertlocationanddata:
(location,data)\n"
%d,%d"
m,&
k);
ListInsert_sq(&
sl,m,k);
\n3-PrintSqlist:
PrintList_sq(&
}
ERROR"
●运行结果
5
1-CreateSqlist:
inputdata12
inputdata23
inputdata34
inputdata45
inputdata56
2-PrintSqlist:
23456
pleaseinputinsertlocationanddata:
(location,data)
3-PrintSqlist:
2345-8589934606
●算法分析
2、为第1题补充删除和查找功能函数,并在主函数中补充代码验证算法的正确性。
删除算法代码:
查找算法代码:
3、阅读下面程序,在横线处填写函数的基本功能。
/*定义表元素的类型*/
typedefstructLNode{/*线性表的单链表存储*/
ElemTypedata;
structLNode*next;
}LNode,*LinkList;
LinkListCreateList(intn);
/**/
voidPrintList(LinkListL);
/*输出带头结点单链表的所有元素*/
intGetElem(LinkListL,inti,ElemType*e);
LinkListCreateList(intn){
LNode*p,*q,*head;
head=(LinkList)malloc(sizeof(LNode));
head->
next=NULL;
p=head;
q=(LinkList)malloc(sizeof(LNode));
inputdata%i:
q->
data);
/*输入元素值*/
q->
/*结点指针域置空*/
p->
next=q;
/*新结点连在表末尾*/
p=q;
returnhead;
voidPrintList(LinkListL){
LNode*p;
p=L->
next;
/*p指向单链表的第1个元素*/
while(p!
=NULL){
p->
p=p->
intGetElem(LinkListL,inti,ElemType*e){
intj=1;
while(p&
&
i){
j++;
p||j>
i)
*e=p->
data;
returnOK;
}/*GetElem*/
intn,i;
ElemTypee;
LinkListL=NULL;
/*定义指向单链表的指针*/
/*输入单链表的元素个数*/
\n1-CreateLinkList:
L=CreateList(n);
\n2-PrintLinkList:
PrintList(L);
\n3-GetElemfromLinkList:
inputi="
i);
if(GetElem(L,i,&
e))
No%iis%d"
i,e);
notexists"
}else
4、为第3题补充插入功能函数和删除功能函数。
并在主函数中补充代码验证算法的正确性。
插入算法代码:
以下为选做实验:
5、循环链表的应用(约瑟夫回环问题)
n个数据元素构成一个环,从环中任意位置开始计数,计到m将该元素从表中取出,重复上述过程,直至表中只剩下一个元素。
提示:
用一个无头结点的循环单链表来实现n个元素的存储。
●算法代码
6、设一带头结点的单链表,设计算法将表中值相同的元素仅保留一个结点。
指针p从链表的第一个元素开始,利用指针q从指针p位置开始向后搜索整个链表,删除与之值相同的元素;
指针p继续指向下一个元素,开始下一轮的删除,直至p==null为至,既完成了对整个链表元素的删除相同值。
实验二栈和队列
1、掌握栈的结构特性及其入栈,出栈操作;
2、掌握队列的结构特性及其入队、出队的操作,掌握循环队列的特点及其操作。
1、顺序栈:
2、链栈:
3、循环队列:
4、链队
1、阅读下面程序,将函数Push和函数Pop补充完整。
要求输入元素序列12345e,运行结果如下所示。
#defineSTACK_INT_SIZE10/*存储空间初始分配量*/
#defineSTACKINCREMENT5/*存储空间分配增量*/
/*定义元素的类型*/
typedefstruct{
ElemType*base;
ElemType*top;
intstacksize;
/*当前已分配的存储空间*/
}SqStack;
intInitStack(SqStack*S);
/*构造空栈*/
intpush(SqStack*S,ElemTypee);
/*入栈*/
intPop(SqStack*S,ElemType*e);
/*出栈*/
intCreateStack(SqStack*S);
/*创建栈*/
voidPrintStack(SqStack*S);
/*出栈并输出栈中元素*/
intInitStack(SqStack*S){
S->
base=(ElemType*)malloc(STACK_INT_SIZE*sizeof(ElemType));
S->
base)returnERROR;
top=S->
base;
stacksize=STACK_INT_SIZE;
}/*InitStack*/
intPush(SqStack*S,ElemTypee){
}/*Push*/
intPop(SqStack*S,ElemType*e){
}/*Pop*/
intCreateStack(SqStack*S){
inte;
if(InitStack(S))
InitSuccess!
else{
InitFail!
inputdata:
(Terminatedbyinputingacharacter)\n"
while(scanf("
e))
Push(S,e);
}/*CreateStack*/
voidPrintStack(SqStack*S){
while(Pop(S,&
%3d"
e);
}/*Pop_and_Print*/
SqStackss;
\n1-createStack\n"
CreateStack(&
ss);
\n2-Pop&
Pr
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 指导
![提示](https://static.bdocx.com/images/bang_tan.gif)