q=q->link;/*q指向an-1结点*/
r=q->link;
q->link=NULL;
while(r->link!
=NULL)
r=r->link;/*r指向最后一个bm-1结点*/
*head=q;
r->link=p;
}
该算法的时间复杂度为O(n+m),但比顺序存储节省时间(不需要移动元素,只需改变指针),空间复杂度为O
(1)
9.
typedefstructnode
{
elemtypedata;
structnode*link;
}NODE;
NODE *union(NODE *ah,NODE*bh)
{
NODE *a,*b,*head,*r,*q;
head=ah;
a=ah;
b=bh;
while(a->link!
=ah&&b->link!
=bh)
{
r=a->link;
q=b->link;
a->link=b;
b->link=r;
a=r;
b=q;
}
if(a->link==ah)/*a的结点个数小于等于b的结点个数*/
{
a->link=b;
while(b->link!
=bh)
b=b->link;
b->link=head;
}
if(b->link==bh)/*b的结点个数小于a的结点个数*/
{
r=a->link;
a->link=b;
b->link=r;
}
return(head);
}
该算法的时间复杂度为O(n+m),其中n和m为两个循环链表的结点个数.
10.
typedefstructnode
{
elemtypedata;
structnode*link;
}NODE;
voidanalyze(NODE*a)
{
NODE *rh,*qh,*r,*q,*p;
inti=0,j=0;/*i为序号是奇数的结点个数j为序号是偶数的结点个数*/
p=a;
rh=(NODE*)malloc(sizeof(NODE));/*rh为序号是奇数的链表头指针*/
qh=(NODE*)malloc(sizeof(NODE));/*qh为序号是偶数的链表头指针*/
r=rh;
q=qh;
while(p!
=NULL)
{
r->link=p;
r=p;
i++;
p=p->link;
if(p!
=NULL)
{
q->link=p;
q=p;
j++;
p=p->link;
}
}
rh->data=i;
r->link=rh;
qh->data=j;
q->link=qh;
}
11.
typedefstructnode
{
elemtypedata;
structnode*link;
}NODE;
voidchange(NODE *head)
{
NODE *p;
p=head;
if(head!
=NULL)
{
while(p->link!
=NULL)
p=p->link;
p->link=head;
}
}
12.
typedefstructnode
{
elemtypedata;
structnode*link;
}NODE;
voiddel(NODE*x,NODE*y)
{
NODE*p,*q;
elemtyped1;
p=y;
q=x;
while(q->next!
=NULL)/*把后一个结点数据域前移到前一个结点*/
{
p->data=q->data;
q=q->link;
p=q;
p->link=NULL;/*删除最后一个结点*/
free(q);
第三章
一、选择题
1.C2.A3.B4.B5.B6.B7、C8、C9、C10、D
二、填空题
1、先进先出;先进后出2、线性;任何;栈顶;队尾;对头3、正确的4、3
三、算法设计题
1.
#defineM100
elemtypestack[M];
inttop1=0,top2=m-1;
intpush(elemtypex,inti)
{
if(top1-top2==1)return
(1);/*上溢处理*/
else
if(i==1)stack[top1++]=x;
if(i==2)stack[top2--]=x;
return(0);
}
intpop(elemtype*px,inti)
{
if(i==1)
if(top1==0)return
(1);
else
{
top1--;
*px=stack[top1];
return(0);
}
else
if(i==2)
if(top2==M-1)return
(1);
else
{
top2++;
*px=stack[top2];
return(0);
}
}
2.
elemtypes1[MAXSIZE],s2[MAZSIZE];
inttop1,top2;
voidenqueue(elemtypex)
{
if(top1==MAXSIZE)return
(1);
else
{
push(s1,x);
return(0);
}}
voiddequeue(elemtype*px)
{
elemtypex;
top2=0;
while(!
empty(s1))
{
pop(s1,&x);
push(s2,x);
}
pop(s2,&x);
while(!
empty(s2))
{
pop(s2,&x);
push(s1,x);
}
}
第四章
一、选择题
1.A2.B3.D4.D5.D
二、算法设计
1.
顺序存储:
#include"string.h"
#defineMAXN100
chars[MAXN];
intS_strlen(chars[])
{
inti;
for(i=0;s[i]!
='\0';i++);
return(i);
}
voidS_strcpy(chars1[],chars2[])//4.3题
{
inti;
for(i=0;s1[i]!
='\0';i++)
s2[i]=s1[i];
s2[i]='\0';
}
一般链接存储:
#include"stdio.h"
typedefstructnode
{
chardata;
structnode*link;
}NODE;
NODE*L_strcpy(NODE*s1)
{
NODE*s2,*t1,*t2,*s;
if(s1==NULL)return(NULL);
else
{
t1=s1;
t2=(NODE*)malloc(sizeof(NODE));
s2=t2;
while(t1!
=NULL)
{
s=(NODE*)malloc(sizeof(NODE));
s->data=t1->data;
t2->link=s;
t2=s;
t1=t1->link;
}
t2->link=NULL;
s=s2;
s2=s2->link;
free(s);
return(s2);
}
}
2.
#include"stdio.h"
typedefstructnode
{
chardata;
structnode*link;
}NODE;
intL_index(NODE*t,NODE*p)
{
NODE*t1,*p1,*t2;
?
inti;
t1=t;i=1;
while(t1!
=NULL)
{
p1=p;
t2=t1->link;
while(p1->data==t1->data&&p1!
=NULL)
{
p1=p1->link;
t1=t1->link;
}
if(p1==NULL)return(i);
i++;
t1=t2;
}
return(0);
}
第五章
一、选择题
1.C2.B3.C4.C5.B6.C7、B8、B
二、填空题
1、loc(A[0][0])+(n*i+j)*k2、3323、424、i*(i+1)/2+j+15、1039;72
三、算法设计题
1.
算法思想:
依题意,先求出每行的最小值元素,放入min[m]之中,再求出每列的最大值元素,放入max[n]之中,若某元素既在min[i]中,又在max[j]中,则该元素A[i][j]便是马鞍点,找出所有这样的元素,即找到了所有马鞍点。
因此,实现本题功能的程序如下:
#include
#definem3
#definen4
voidminmax(inta[m][n])
{
inti1,j,have=0;
intmin[m],max[n];
for(i1=0;i1{
min[i1]=a[i1][0];
for(j=1;jif(a[i1][j]}
for(j=0;j{
max[j]=a[0][j];
for(i1=1;i1if(a[i1][j]>max[j])max[j]=a[i1][j];
}
for(i1=0;i1for(j=0;jif(min[i1]==max[j])
{
printf("(%d,%d):
%d\n",i1,j,a[i1][j]);
have=1;
}
if(!
have)printf("没有鞍点\n");
}
2.
算法思想:
本题用一个含有n个元素的数组a,初始时a[i]中存放猴子的编号i,计数器似的值为0。
从a[i]开始循环报数,每报一次,计数器的值加1,凡报到m时便打印出a[i]值(退出圈外的猴子的编号),同时将a[i]的值改为O(以后它不再参加报数),计数器值重新置为0。
该函数一直进行到n只猴子全部退出圈外为止,最后退出的猴子就是大王。
因此,现本题功能的程序如下:
#include"stdio.h"
main()
{
inta[100];
intcount,d,j,m,n;
scanf("%d%d",&m,&n);/*n>=m*/
for(j=0;ja[j]=j+1;
count=0;d=0;
while(dfor(j=0;jif(a[j]!
=0)
{
count++;
if(count==m)
{
printf("%d",a[j]);
a[j]=0;
count=0;
d++;
}
}
}
3.
#include"stdio.h"
#include"malloc.h"
typedefstructnode
{inttag;
union
{structnode*sublist;
chardata;
}dd;
structnode*link;
}NODE;
NODE*creat_GL(char**s)
{
NODE*h;
charch;
ch=*(*s);
(*s)++;
if(ch!
='\0')
{
h=(NODE*)malloc(sizeof(NODE));
if(ch=='(')
{
h->tag=1;
h->dd.sublist=creat_GL(s);
}
Else
{
h->tag=0;
h->dd.data=ch;
}
}
else
h=NULL;
ch=*(*s);
(*s)++;
if(h!
=NULL)
if(ch==',')
h->link=creat_GL(s);
else
h->link=NULL;
return(h);
}
voidprn_GL(NODE*p)
{
if(p!
=NULL)
{
if(p->tag==1)
{
printf("(");
if(p->dd.sublist==NULL)
printf("");
else
prn_GL(p->dd.sublist);
}
else
printf("%c",p->dd.data);
if(p->tag==1)
printf(")");
if(p->link!
=NULL)
{
printf(",");
prn_GL(p->link);
}
}
}
NODE*copy_GL(NODE*p)
{
NODE*q;
if(p==NULL)return(NULL);
q=(NODE*)malloc(sizeof(NODE));
q->tag=p->tag;
if(p->tag)
q->dd.sublist=copy_GL(p->dd.sublist);
else
q->dd.data=p->dd.data;
q->link=copy_GL(p->link);
return(q);
}
NODE*head(NODE*p)/*求表头函数*/
{
return(p->dd.sublist);
}
NODE*tail(NODE*p)/*求表尾函数*/
{
return(p->link);
}
intsum(NODE*p)/*求原子结点的数据域之和函数*/
{intm,n;
if(p==NULL)return(0);
else
{if(p->tag==0)n=p->dd.data;
else
n=sum(p->dd.sublist);
if(p->link!
=NULL)
m=sum(p->link);
elsem=0;
return(n+m);
}
}
intdepth(NODE*p)/*求表的深度函数*/
{
inth,maxdh;
NODE*q;
if(p->tag==0)return(0);
else
if(p->tag==1&&p->dd.sublist==NULL)return1;
else
{
maxdh=0;
while(p!
=NULL)
{
if(p->tag==0)h=0;
else
{q=p->dd.sublist;
h=depth(q);
}
if(h>maxdh)maxdh=h;
p=p->