数据结构实验答案Word格式.docx
《数据结构实验答案Word格式.docx》由会员分享,可在线阅读,更多相关《数据结构实验答案Word格式.docx(63页珍藏版)》请在冰豆网上搜索。
N;
printf(“%4d”,a[i]);
N/2;
i++){/*交换数组元素使之逆序*/
temp=a[i];
a[i]=a[N-i-1];
a[N-i-1]=temp;
}
printf(“\nthechangedArrayis:
\n”);
3、调试程序:
在二维数组中,若某一位置上的元素在该行中最大,而在该列中最小,则该元素即为该二维数组的一个鞍点。
要求从键盘上输入一个二维数组,当鞍点存在时,把鞍点找出来。
#defineM3
#defineN4
inta[M][N],i,j,k;
printf(“请输入二维数组的数据:
M;
for(j=0;
j<
j++)
scanf(“%d”,&
a[i][j]);
i++){/*输出矩阵*/
printf(“%4d”,a[i][j]);
printf(“\n”);
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行找到鞍点*/
printf(“%d,%d,%d\n”),a[i][k],i,k);
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(“\n”);
printf(%4d”,*p);
5、调试程序:
输入10个学生的成绩,每个学生成绩包括学号、姓名和三门课的成绩。
要求打印出三门课的平均成绩及成绩最高者的姓名和成绩。
#defineN10;
structstudent{
charnum[6];
/*学号*/
charname[8];
/*姓名*/
intscore[3];
/*成绩*/
floatavr;
/*平均成绩*/
}stu[N];
inti,j,max,maxi,sum;
floataverage;
i++){/*输入10个学生的成绩信息*/
printf(“\n请输入第%d学生的成绩:
\n”,i+1);
printf(“学号:
”);
scanf(“%s”,stu[i].num);
printf(“姓名”);
scanf(“%s”,stu[i].name);
3;
j++){
printf(“成绩%d”,j+1);
stu[i].score[j]);
}
average=0;
max=0;
maxi=0;
i++){/*计算平均成绩,找出成绩最高的学生*/
sum=0;
sum+=stu[i].score[j];
stu[i].avr=sum/3.0;
average+=stu[i].avr;
if(sum>
max){
max=sum;
maxi=i;
average/=10;
printf(“学号姓名成绩1成绩2成绩3平均分\n);
10;
printf(“%8s%10s”,stu[i].num,stu[i].name);
printf(“%7d”,stu[i].score[j]);
printf(“%6.2f\n”,stu[i].avr);
printf(“平均成绩是:
%5.2f\n”,average);
printf(“最好成绩的学生是:
%s,总分是%d”,stu[maxi].name,max);
运行结果
3、实验小结
对C语言中函数、数组、指针和结构体的概念,有了进一步的加深。
并且可以利用C语言进行初步程序设计。
四、教师评语
实验一顺序表与链表
1、掌握线性表中元素的前驱、后续的概念。
2、掌握顺序表与链表的建立、插入元素、删除表中某元素的算法。
3、对线性表相应算法的时间复杂度进行分析。
4、理解顺序表、链表数据结构的特点(优缺点)。
1、阅读下面程序,在横线处填写函数的基本功能。
并运行程序,写出结果。
malloc.h>
#defineERROR0
#defineOK1
#defineINIT_SIZE5/*初始分配的顺序表长度*/
#defineINCREM5/*溢出时,顺序表长度的增量*/
typedefintElemType;
/*定义表元素的类型*/
typedefstructSqlist{
ElemType*slist;
/*存储空间的基地址*/
intlength;
/*顺序表的当前长度*/
intlistsize;
/*当前分配的存储空间*/
}Sqlist;
intInitList_sq(Sqlist*L);
/*初始化顺序表L,并将其长度设为0*/
intCreateList_sq(Sqlist*L,intn);
/*构造顺序表的长度为n*/
intListInsert_sq(Sqlist*L,inti,ElemTypee);
/*在顺序线性表L中第i个
元素之前插入新的元素e*/
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;
n;
printf("
inputdata%d"
i+1);
scanf("
%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]=k;
slist[i-1]=e;
length++;
}/*ListInsert*/
/*在顺序表中删除第i个元素*/
intListDelete_sq(Sqlist*L,inti)
{
if((i<
1)||(i>
length))returnERROR;
for(p=i-1;
->
p++)
slist[p]=L->
slist[p+1];
length--;
/*在顺序表中查找指定值元素,返回其序号*/
intListLocate(Sqlist*L,ElemTypee){
Sqlistsl;
intn;
pleaseinputn:
"
);
/*输入顺序表的元素个数*/
n);
if(n>
0){
\n1-CreateSqlist:
\n"
InitList_sq(&
sl);
CreateList_sq(&
sl,n);
\n2-PrintSqlist:
PrintList_sq(&
}else
ERROR"
●算法分析与运行结果
5
1-CreateSqlist:
inputdata10
inputdata25
inputdata38
inputdata43
inputdata56
2-PrintSqlist:
05836Pressanykeytocontinue
2、为第1题补充删除和查找功能函数,并在主函数中补充代码验证算法的正确性。
算法代码:
{intp;
{L->
intListLocate(Sqlist*L,ElemTypee)
inti=0;
while((i<
length)&
&
(L->
slist[i]!
=e))
i++;
if(i<
length)
return(i+1);
else
return(-1);
3、阅读下面程序,在横线处填写函数的基本功能。
typedefstructLNode{/*线性表的单链表存储*/
ElemTypedata;
structLNode*next;
}LNode,*LinkList;
LinkListCreateList(intn);
/构造顺序表的长度*/
voidPrintList(LinkListL);
/*输出带头结点单链表的所有元素*/
intGetElem(LinkListL,inti,ElemType*e);
/*在顺序线性表L中,当第i个元素存在时,将其赋值为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"
1-CreateLinkList:
inputdata1:
8
inputdata2:
6
inputdata3:
3
inputdata4:
inputdata5:
4
2-PrintLinkList:
86354
3-GetElemfromLinkList:
inputi=2
No2is6Pressanykeytocontinue
4、为第3题补充插入功能函数和删除功能函数。
并在主函数中补充代码验证算法的正确性。
●算法代码
intListInsert_sq(LNode*L,inti,ElemTypee){
data=(ElemType*)realloc(L->
data,
data)
●
/*
以下为选做实验:
5、循环链表的应用(约瑟夫回环问题)
n个数据元素构成一个环,从环中任意位置开始计数,计到m将该元素从表中取出,重复上述过程,直至表中只剩下一个元素。
提示:
用一个无头结点的循环单链表来实现n个元素的存储。
6、设一带头结点的单链表,设计算法将表中值相同的元素仅保留一个结点。
指针p从链表的第一个元素开始,利用指针q从指针p位置开始向后搜索整个链表,删除与之值相同的元素;
指针p继续指向下一个元素,开始下一轮的删除,直至p==null为至,既完成了对整个链表元素的删除相同值。
三、实验小结
具体的掌握线性表中元素的前驱、后续的概念。
以及顺序表与链表的建立、插入元素、删除表中某元素的算法。
并学习了对线性表相应算法的时间复杂度进行分析。
实验二栈和队列
1、掌握栈的结构特性及其入栈,出栈操作;
2、掌握队列的结构特性及其入队、出队的操作,掌握循环队列的特点及其操作。
1、阅读下面程序,将函数Push和函数Pop补充完整。
要求输入元素序列12345e,运行结果如下所示。
#defineSTACK_INT_SIZE10/*存储空间初始分配量*/
#defineSTACKINCREMENT5/*存储空间分配增量*/
/*定义元素的类型*/
typedefstruct{
ElemType*base;
ElemType*top;
intstacksize;
/*当前已分配的存储空间*/
}SqStack;
intInitStack(SqStack*S);
/*构造空栈*/
intpush(SqStack*S,ElemType*e);
/*入栈*/
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&
Print\n"
PrintStack(&
}
●算法分析:
输入元素序列12345,为什么输出序列为54321?
体现了栈的什么特性?
2、在第1题的程序中,编写