数据结构上机实验答案教学提纲.docx
《数据结构上机实验答案教学提纲.docx》由会员分享,可在线阅读,更多相关《数据结构上机实验答案教学提纲.docx(33页珍藏版)》请在冰豆网上搜索。
数据结构上机实验答案教学提纲
数据结构上机实验答案
《数据结构实验指导书》答案
实验一:
1、请编写函数intfun(int*a,int*b),函数的功能是判断两个指针a和b所指存储单元的值的符号是否相同;若相同函数返回1,否则返回0。
这两个存储单元中的值都不为0。
在主函数中输入2个整数、调用函数fun、输出结果。
#include
intfun(int*a,int*b)
{
if(*a*(*b)>0)return
(1);
elsereturn(0);
}
main()
{
intx,y;
scanf("%d%d",&x,&y);
if(fun(&x,&y))printf("yes\n");
elseprintf("no");
}
2、计算1+2+3+……+100,要求用指针进行设计。
即设计函数intfun(int*n)实现求1+2+3+……+*n,在主函数中输入、调用、输出结果。
#include
intfun(int*n)
{
inti,sum=0;
for(i=1;i<=*n;i++)
sum+=i;
return(sum);
}
main()
{
intx,sum;
scanf("%d",&x);
printf("thesumis%d\n",fun(&x));
}
3、函数的功能是求数组a中最大数的位置(位序号)。
在主函数中输入10个整数、调用函数fun、输出结果。
#defineN10
#include
voidinput(int*a,intn)
{
inti;
for(i=0;iscanf("%d",a+i);/*scanf("%d",&a[i]);*/
}
intfun(int*a,intn)
{
inti,*max;
max=a;
for(i=1;iif(a[i]>*max)max=a+i;
return(max-a);
}
main()
{inta[N],maxi;
input(a,N);
maxi=fun(a,N);
printf("\nthemaxpositionis%d\n",maxi);
}
4、请编写函数fun(int*a,intn,int*odd,int*even),函数的功能是分别求出数组a中所有奇数之和和所有偶数之和。
形参n给出数组中数据的个数;利用指针odd和even分别返回奇数之和和偶数之和。
在主函数中输入10个整数、调用函数fun、输出结果。
#defineN10
#include
voidinput(int*a,intn)
{
inti;
for(i=0;iscanf("%d",a+i);/*scanf("%d",&a[i]);*/
}
voidfun(int*a,intn,int*odd,int*even)
{
inti,sum1=0,sum2=0;
for(i=0;i{
if(a[i]%2==0)sum1+=a[i];
elsesum2+=a[i];
}
*odd=sum1;
*even=sum2;
}
main()
{inta[N],odd,even;
input(a,N);
fun(a,N,&odd,&even);
printf("theoddis%d\ttheevenis%d\n",odd,even);
}
5、请编写函数intfun(int*a,int*b,intn),函数的功能是把数组a中所有为偶数的数,放在另一个数组中b。
在主函数中输入10个整数、调用函数fun、输出结果。
#defineN10
#include
voidinput(int*a,intn)
{
inti;
for(i=0;iscanf("%d",a+i);/*scanf("%d",&a[i]);*/
}
voidoutput(int*a,intn)
{
inti;
printf("\ntheoddis:
\n");
for(i=0;iprintf("%5d",*(a+i));/*printf("%d",a[i]);*/
}
intfun(int*a,int*b,intn)
{
inti,j=0;
for(i=0;iif(a[i]%2==0){b[j]=a[i];j++;}
return(j);
}
main()
{inta[N],b[N],m;
input(a,N);
m=fun(a,b,N);
output(b,m);
}
6、请编写函数intfun(int*a,,intn),函数的功能是把数组a中最大数和最小数交换。
在主函数中输入10个整数、调用函数fun、输出结果。
#defineN10
#include
voidinput(int*a,intn)
{
inti;
for(i=0;iscanf("%d",a+i);/*scanf("%d",&a[i]);*/
}
voidoutput(int*a,intn)
{
inti;
printf("\ntheresultis:
\n");
for(i=0;iprintf("%5d",*(a+i));/*printf("%d",a[i]);*/
}
voidfun(int*a,intn)
{
inti,*max,*min,temp;
max=min=a;
for(i=1;i{
if(a[i]>*max)max=a+i;
if(a[i]<*min)min=a+i;
}
printf("themaxis%d,thepositionis%d\n",*max,max-a);
printf("theminis%d,thepositionis%d\n",*min,min-a);
if(max!
=min)
{temp=*max;*max=*min;*min=temp;}
}
main()
{inta[N],m;
input(a,N);
fun(a,N);
output(a,N);
}
7、请编写函数intfun(inta[4][4]),函数的功能是把矩阵a转置。
在主函数中输入、调用函数fun、输出结果。
#defineN4
#include
voidinput(inta[][4],intn)
{
inti,j;
for(i=0;ifor(j=0;jscanf("%d",&a[i][j]);
}
voidoutput(inta[][4],intn)
{
inti,j;
printf("\ntheresultis:
\n");
for(i=0;i{printf("\n");
for(j=0;jprintf("%4d",*(*(a+i)+j));/*printf("%d",a[i][j]);*/
}
}
voidfun(inta[][4],intn)
{
inti,j,temp;
for(i=0;ifor(j=0;j
{temp=a[i][j];a[i][j]=a[j][i];a[j][i]=temp;}
}
main()
{inta[N][N];
input(a,N);
fun(a,N);
output(a,N);
}
8、请编写函数intfun(char*a),函数的功能是分别求出字符串a的长度。
在主函数中输入1个字符串、调用函数fun、输出结果。
#include
intfun(char*a)
{
inti=0;
char*p;
p=a;
while(*p)
{i++;
p++;
}
return(i);
}
main()
{
charstr[20],*cp;
cp=str;
gets(cp);
printf("thelengthof%sis%d\n",cp,fun(cp));
}
9、
10、
#include
#include
#defineN2
typedefstructstudent/*定义数据结构(数据类型)*/
{longnum;
charname[10];
intscore[3];/*存放三门课成绩*/
floataverage;/*/平均成绩*/
}stu;
voidintput(stus[],intn)/*输入数据*/
{inti,j;/*i表示处理学生的下标,J表示成绩编号*/
for(i=0;i{
printf("inputnum:
\n");
scanf("%ld",&s[i].num);
printf("inputname:
\n");
scanf("%s",s[i].name);
printf("input3score:
\n");
for(j=0;j<3;j++)
scanf("%d",&s[i].score[j]);
}
}
voidstu_av(stus[],intn)/*求每个学生的平均成绩*/
{
inti,j,sum;
for(i=0;i{
sum=0;
for(j=0;j<3;j++)
sum+=s[i].score[j];
s[i].average=sum/3.0;
}
}
floatav(stus[],intn)/*求总平均成绩*/
{
inti;
floatsum=0.0,ave;
for(i=0;isum+=s[i].average;
ave=sum/n;
return(ave);
}
intmax(stus[],intn)/*求平均成绩最高学生的下标*/
{
inti,maxi=0;
for(i=1;iif(s[i].average>s[maxi].average)
maxi=i;
return(maxi);
}
main()
{intmaxi,j;
stua[N];/*定义变量*/
intput(a,N);
stu_av(a,N);
printf("thescoreaverageis%f\n",av(a,N));
maxi=max(a,N);
printf("themaxaveragestudentdata:
\n");
printf("%10ld",a[maxi].num);
printf("%10s",a[maxi].name);
for(j=0;j<3;j++)
printf("%5d",a[maxi].score[j]);
printf("%5.1f",a[maxi].average);
getch();
}
实验二
1、
#include
#defineMaxLen50
typedefintelemtype;
structdatatype
{elemtype*elem;
intlength;
};
typedefstructdatatypesqlist;
voidcreate(sqlist*a)
{
inti,n;
a->elem=(elemtype*)malloc(MaxLen*sizeof(elemtype));
printf("创建一个顺序表\n");
printf("输入元素个数\n");
scanf("%d",&a->length);
for(i=0;ilength;i++)
{
printf("输入第%d个元素值:
",i+1);
scanf("%d",a->elem+i);
}
}
voidinvert(sqlist*a)
{
intm=a->length/2,i;
elemtypetemp;
for(i=0;i{
temp=*(a->elem+i);
*(a->elem+i)=*(a->elem+a->length-1-i);
*(a->elem+a->length-1-i)=temp;
}
}
voiddisp(sqlist*a)
{inti;
for(i=0;ilength;i++)
printf("%5d:
%d\n",i+1,*(a->elem+i));
getch();
}
voidmain()
{
sqlista;
create(&a);
disp(&a);
invert(&a);
disp(&a);
}
2、
#include
#include
#defineNULL0
typedefintelemtype;
typedefstructlinknode
{
elemtypedata;
structlinknode*next;
}nodetype;
nodetype*create()
{
elemtyped;
nodetype*h,*s,*t;
inti=1;
h=NULL;
printf("建立一个单链表\n");
while
(1)
{
printf("输入第%d节点data域值:
",i);
scanf("%d",&d);
if(d==0)break;/*以0表示输入结束*/
if(i==1)/*建立第一个结点*/
{
h=(nodetype*)malloc(sizeof(nodetype));
h->data=d;h->next=NULL;t=h;
}
else
{
s=(nodetype*)malloc(sizeof(nodetype));
s->data=d;s->next=NULL;t->next=s;
t=s;/*t始终指向生成的单链表的最后一个结点*/
}
i++;
}
returnh;
}
voiddisp(nodetype*h)
{
nodetype*p=h;
printf("输出一个单链表:
\n");
if(p==NULL)printf("空表");
while(p!
=NULL)
{
printf("%d",p->data);p=p->next;
}
printf("\n");
getch();
}
intlen(nodetype*h)
{
inti=0;
nodetype*p=h;
while(p)
{i++;p=p->next;}
return(i);
}
nodetype*invert(nodetype*h)
{
nodetype*p,*q,*r;
if(len(h)<=1)
{printf("逆置的单链表至少有2个节点\n");
return(NULL);
}
else
{p=h;q=p->next;
while(q!
=NULL)
{r=q->next;
q->next=p;
p=q;q=r;
}
h->next=NULL;
h=p;
returnh;
}
}
voidmain()
{
nodetype*head;
head=create();
disp(head);
head=invert(head);
disp(head);
}
4、
(1)
#include
#defineMaxLen50
typedefstruct
{longnum;
intscore;
}elemtype;
typedefstructdatatype
{elemtype*elem;
intlength;
}sqlist;
voidcreate(sqlist*a)
{
longi=0,n;
ints;
a->elem=(elemtype*)malloc(MaxLen*sizeof(elemtype));
printf("创建一个顺序表\n");
printf("输入学生学号和成绩:
0作为结束标志\n");
scanf("%ld%d",&n,&s);
while(n!
=0)
{
(a->elem)[i].num=n;
(a->elem)[i].score=s;
i++;
scanf("%ld%d",&n,&s);
}
a->length=i;
}
voiddisp(sqlist*a)
{inti;
for(i=0;ilength;i++)
printf("%5d:
%ld%d\n",i+1,(a->elem)[i].num,(a->elem)[i].score);
getch();
}
voidmain()
{
sqlista;
create(&a);
disp(&a);
}
(2)见5
(2)
5、
(1)
#include
#defineMaxLen50
typedefstruct
{longnum;
intscore;
}elemtype;
typedefstructdatatype
{elemtype*elem;
intlength;
}sqlist;
voidcreate(sqlist*a)
{
longi=0,n;
ints;
a->elem=(elemtype*)malloc(MaxLen*sizeof(elemtype));
printf("创建一个顺序表\n");
printf("输入学生学号和成绩:
0作为结束标志\n");
scanf("%ld%d",&n,&s);
while(n!
=0)
{
(a->elem)[i].num=n;
(a->elem)[i].score=s;
i++;
scanf("%ld%d",&n,&s);
}
a->length=i;
}
voidsort(sqlist*a)
{inti,j,k,s;
longn;
for(i=0;ilength-1;i++)
{k=i;
for(j=i+1;jlength;j++)
if((a->elem)[j].score<(a->elem)[k].score)k=j;
if(k!
=i)
{
n=(a->elem)[i].num;(a->elem)[i].num=(a->elem)[k].num;
(a->elem)[k].num=n;
s=(a->elem)[i].score;(a->elem)[i].score=(a->elem)[k].score;
(a->elem)[k].score=s;
}
}
}
voiddisp(sqlist*a)
{inti;
for(i=0;ilength;i++)
printf("%5d:
%ld%d\n",i+1,(a->elem)[i].num,(a->elem)[i].score);
getch();
}
voidmain()
{
sqlista;
create(&a);
disp(&a);
sort(&a);
disp(&a);
}
(2)
#include
#include
#defineNULL0
typedefstructlinknode
{
longnum;
intscore;
structlinknode*next;
}nodetype;
nodetype*create()
{
longn;
intsc;
nodetype*h,*s,*t;
h=(nodetype*)malloc(sizeof(nodetype));;
h->next=NULL;
t=h;
printf("创建一个顺序表\n");
printf("输入学生学号和成绩:
0作为结束标志\n");
scanf("%ld%d",&n,&sc);
while(n!
=0)
{
s=(nodetype*)malloc(sizeof(nodetype));
s->num=n;s->score=sc;t->next=s;t=s;
scanf("%ld%d",&n,&sc);
}
t->next=NULL;
returnh;
}
voiddisp(nodetype*h)
{
nodetype*p=h->next;
printf("输出一个单链表:
\n");
while(p!
=NULL)
{
printf("%ld%d\n",p->num,p->score);p=p->next;
}
printf("\n");
getch();
}
nodetype*insertorder(nodetype*h,nodetype*s)
{
nodetype*p,*q;
q=h;p=q->next;
while(p!
=NULL&&s->score>p->score)
{
q=p;
p=p->next;
}
s->next=p;
q->next=s;
return(h);
}
nodetype*sort(nodetype*h)
{
nodetype*p,*s;
p=h->next;
h->next=NULL;
while(p!
=NULL)
{
s=p->next;
h=insertorder(h,p);
p=s;
}
returnh;
}
voidmain()
{
nodetype*head;
head=create();
disp(head);
head=sort(head);
disp(head);
}
实验三:
7、试写一个算法,识别依次读入的一个以@为结束符的字符序列是否为形如‘序列1&序列2’模式的字符序列。
其中序列1和序列2中不包含字符’&’,且序列2是序列1的逆序列。
例如,‘a+b&b+a’是属于该模式的字符序列,而‘1+2&2-1’则不是。
int