严蔚敏《数据结构c语言版习题集》答案第五章 数组和广义表文库.docx

上传人:b****5 文档编号:3878308 上传时间:2022-11-26 格式:DOCX 页数:19 大小:20.06KB
下载 相关 举报
严蔚敏《数据结构c语言版习题集》答案第五章 数组和广义表文库.docx_第1页
第1页 / 共19页
严蔚敏《数据结构c语言版习题集》答案第五章 数组和广义表文库.docx_第2页
第2页 / 共19页
严蔚敏《数据结构c语言版习题集》答案第五章 数组和广义表文库.docx_第3页
第3页 / 共19页
严蔚敏《数据结构c语言版习题集》答案第五章 数组和广义表文库.docx_第4页
第4页 / 共19页
严蔚敏《数据结构c语言版习题集》答案第五章 数组和广义表文库.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

严蔚敏《数据结构c语言版习题集》答案第五章 数组和广义表文库.docx

《严蔚敏《数据结构c语言版习题集》答案第五章 数组和广义表文库.docx》由会员分享,可在线阅读,更多相关《严蔚敏《数据结构c语言版习题集》答案第五章 数组和广义表文库.docx(19页珍藏版)》请在冰豆网上搜索。

严蔚敏《数据结构c语言版习题集》答案第五章 数组和广义表文库.docx

严蔚敏《数据结构c语言版习题集》答案第五章数组和广义表文库

第五章数组和广义表

5.18

voidRSh(intA[n],intk)//把数组A的元素循环右移k位,只用一个辅助存储空间

{

for(i=1;i<=k;i++)

if(n%i==0&&k%i==0)p=i;//求n和k的最大公约数p

for(i=0;i

{

j=i;l=(i+k)%n;temp=A[i];

while(l!

=i)

{

A[j]=temp;

temp=A[l];

A[l]=A[j];

j=l;l=(j+k)%n;

}//循环右移一步

A[i]=temp;

}//for

}//RSh

分析:

要把A的元素循环右移k位,则A[0]移至A[k],A[k]移至A[2k]......直到最终回到A[0].然而这并没有全部解决问题,因为有可能有的元素在此过程中始终没有被访问过,而是被跳了过去.分析可知,当n和k的最大公约数为p时,只要分别以A[0],A[1],...A[p-1]为起点执行上述算法,就可以保证每一个元素都被且仅被右移一次,从而满足题目要求.也就是说,A的所有元素分别处在p个"循环链"上面.举例如下:

n=15,k=6,则p=3.

第一条链:

A[0]->A[6],A[6]->A[12],A[12]->A[3],A[3]->A[9],A[9]->A[0].

第二条链:

A[1]->A[7],A[7]->A[13],A[13]->A[4],A[4]->A[10],A[10]->A[1].

第三条链:

A[2]->A[8],A[8]->A[14],A[14]->A[5],A[5]->A[11],A[11]->A[2].

恰好使所有元素都右移一次.

虽然未经数学证明,但作者相信上述规律应该是正确的.

5.19

voidGet_Saddle(intA[m][n])//求矩阵A中的马鞍点

{

for(i=0;i

{

for(min=A[i][0],j=0;j

if(A[i][j]

for(j=0;j

if(A[i][j]==min)//判断这个(些)最小值是否鞍点

{

for(flag=1,k=0;k

if(min

if(flag)

printf("Foundasaddleelement!

\nA[%d][%d]=%d",i,j,A[i][j]);

}

}//for

}//Get_Saddle

5.20

本题难度极大,故仅探讨一下思路.这一题的难点在于,在多项式的元数m未知的情况下,如何按照降幂次序输出各项.可以考虑采取类似于层序遍历的思想,从最高次的项开始,依次对其每一元的次数减一,入一个队列.附设访问标志visited以避免重复.

5.21

voidTSMatrix_Add(TSMatrixA,TSMatrixB,TSMatrix&C)//三元组表示的稀疏矩阵加法

{

C.mu=A.mu;C.nu=A.nu;C.tu=0;

pa=1;pb=1;pc=1;

for(x=1;x<=A.mu;x++)//对矩阵的每一行进行加法

{

while(A.data[pa].i

while(B.data[pb].i

while(A.data[pa].i==x&&B.data[pb].i==x)//行列值都相等的元素

{

if(A.data[pa].j==B.data[pb].j)

{

ce=A.data[pa].e+B.data[pb].e;

if(ce)//和不为0

{

C.data[pc].i=x;

C.data[pc].j=A.data[pa].j;

C.data[pc].e=ce;

pa++;pb++;pc++;

}

}//if

elseif(A.data[pa].j>B.data[pb].j)

{

C.data[pc].i=x;

C.data[pc].j=B.data[pb].j;

C.data[pc].e=B.data[pb].e;

pb++;pc++;

}

else

{

C.data[pc].i=x;

C.data[pc].j=A.data[pa].j;

C.data[pc].e=A.data[pa].e

pa++;pc++;

}

}//while

while(A.data[pa]==x)//插入A中剩余的元素(第x行)

{

C.data[pc].i=x;

C.data[pc].j=A.data[pa].j;

C.data[pc].e=A.data[pa].e

pa++;pc++;

}

while(B.data[pb]==x)//插入B中剩余的元素(第x行)

{

C.data[pc].i=x;

C.data[pc].j=B.data[pb].j;

C.data[pc].e=B.data[pb].e;

pb++;pc++;

}

}//for

C.tu=pc;

}//TSMatrix_Add

5.22

voidTSMatrix_Addto(TSMatrix&A,TSMatrixB)//将三元组矩阵B加到A上

{

for(i=1;i<=A.tu;i++)

A.data[MAXSIZE-A.tu+i]=A.data[i];/把A的所有元素都移到尾部以腾出位置

pa=MAXSIZE-A.tu+1;pb=1;pc=1;

for(x=1;x<=A.mu;x++)//对矩阵的每一行进行加法

{

while(A.data[pa].i

while(B.data[pb].i

while(A.data[pa].i==x&&B.data[pb].i==x)//行列值都相等的元素

{

if(A.data[pa].j==B.data[pb].j)

{

ne=A.data[pa].e+B.data[pb].e;

if(ne)//和不为0

{

A.data[pc].i=x;

A.data[pc].j=A.data[pa].j;

A.data[pc].e=ne;

pa++;pb++;pc++;

}

}//if

elseif(A.data[pa].j>B.data[pb].j)

{

A.data[pc].i=x;

A.data[pc].j=B.data[pb].j;

A.data[pc].e=B.data[pb].e;

pb++;pc++;

}

else

{

A.data[pc].i=x;

A.data[pc].j=A.data[pa].j;

A.data[pc].e=A.data[pa].e

pa++;pc++;

}

}//while

while(A.data[pa]==x)//插入A中剩余的元素(第x行)

{

A.data[pc].i=x;

A.data[pc].j=A.data[pa].j;

A.data[pc].e=A.data[pa].e

pa++;pc++;

}

while(B.data[pb]==x)//插入B中剩余的元素(第x行)

{

A.data[pc].i=x;

A.data[pc].j=B.data[pb].j;

A.data[pc].e=B.data[pb].e;

pb++;pc++;

}

}//for

A.tu=pc;

for(i=A.tu;i

}//TSMatrix_Addto

5.23

typedefstruct{

intj;

inte;

}DSElem;

typedefstruct{

DSElemdata[MAXSIZE];

intcpot[MAXROW];//这个向量存储每一行在二元组中的起始位置

intmu,nu,tu;

}DSMatrix;//二元组矩阵类型

StatusDSMatrix_Locate(DSMatrixA,inti,intj,int&e)//求二元组矩阵的元素A[i][j]的值e

{

for(s=cpot[i];s

=j;s++);//注意查找范围

if(A.data[s].i==i&&A.data[s].j==j)//找到了元素A[i][j]

{

e=A.data[s];

returnOK;

}

returnERROR;

}//DSMatrix_Locate

5.24

typedefstruct{

intseq;//该元素在以行为主序排列时的序号

inte;

}SElem;

typedefstruct{

SElemdata[MAXSIZE];

intmu,nu,tu;

}SMatrix;//单下标二元组矩阵类型

StatusSMatrix_Locate(SMatrixA,inti,intj,int&e)//求单下标二元组矩阵的元素A[i][j]的值e

{

s=i*A.nu+j+1;p=1;

while(A.data[p].seq

if(A.data[p].seq==s)//找到了元素A[i][j]

{

e=A.data[p].e;

returnOK;

}

returnERROR;

}//SMatrix_Locate

5.25

typedefenum{0,1}bool;

typedefstruct{

intmu,nu;

intelem[MAXSIZE];

boolmap[mu][nu];

}BMMatrix;//用位图表示的矩阵类型

voidBMMatrix_Add(BMMatrixA,BMMatrixB,BMMatrix&C)//位图矩阵的加法

{

C.mu=A.mu;C.nu=A.nu;

pa=1;pb=1;pc=1;

for(i=0;i

for(j=0;j

{

if(A.map[i][j]&&B.map[i][j]&&(A.elem[pa]+B.elem[pb]))//结果不为0

{

C.elem[pc]=A.elem[pa]+B.elem[pb];

C.map[i][j]=1;

pa++;pb++;pc++;

}

elseif(A.map[i][j]&&!

B.map[i][j])

{

C.elem[pc]=A.elem[pa];

C.map[i][j]=1;

pa++;pc++;

}

elseif(!

A.map[i][j]&&B.map[i][j])

{

C.elem[pc]=B.elem[pb];

C.map[i][j]=1;

pb++;pc++;

}

}

}//BMMatrix_Add

5.26

voidPrint_OLMatrix(OLMatrixA)//以三元组格式输出十字链表表示的矩阵

{

for(i=0;i

{

if(A.rhead[i])

for(p=A.rhead[i];p;p=p->right)//逐次遍历每一个行链表

printf("%d%d%d\n",i,p->j,p->e;

}

}//Print_OLMatrix

5.27

voidOLMatrix_Add(OLMatrix&A,OLMatrixB)//把十字链表表示的矩阵B加到A上

{

for(j=1;j<=A.nu;j++)cp[j]=A.chead[j];//向量cp存储每一列当前最后一个元素的指针

for(i=1;i<=A.mu;i++)

{

pa=A.rhead[i];pb=B.rhead[i];pre=NULL;

while(pb)

{

if(pa==NULL||pa->j>pb->j)//新插入一个结点

{

p=(OLNode*)malloc(sizeof(OLNode));

if(!

pre)A.rhead[i]=p;

elsepre->right=p;

p->right=pa;pre=p;

p->i=i;p->j=pb->j;p->e=pb->e;//插入行链表中

if(!

A.chead[p->j])

{

A.chead[p->j]=p;

p->down=NULL;

}

else

{

while(cp[p->j]->down)cp[p->j]=cp[p->j]->down;

p->down=cp[p->j]->down;

cp[p->j]->down=p;

}

cp[p->j]=p;//插入列链表中

}//if

elseif(pa->jj)

{

pre=pa;

pa=pa->right;

}//pa右移一步

elseif(pa->e+pb->e)

{

pa->e+=pb->e;

pre=pa;pa=pa->right;

pb=pb->right;

}//直接相加

else

{

if(!

pre)A.rhead[i]=pa->right;

elsepre->right=pa->right;

p=pa;pa=pa->right;//从行链表中删除

if(A.chead[p->j]==p)

A.chead[p->j]=cp[p->j]=p->down;

elsecp[p->j]->down=p->down;//从列链表中删除

free(p);

}//else

}//while

}//for

}//OLMatrix_Add

分析:

本题的具体思想在课本中有详细的解释说明.

5.28

voidMPList_PianDao(MPList&L)//对广义表存储结构的多元多项式求第一变元的偏导

{

for(p=L->hp->tp;p&&p->exp;pre=p,p=p->tp)

{

if(p->tag)Mul(p->hp,p->exp);

elsep->coef*=p->exp;//把指数乘在本结点或其下属结点上

p->exp--;

}

pre->tp=NULL;

if(p)free(p);//删除可能存在的常数项

}//MPList_PianDao

voidMul(MPList&L,intx)//递归算法,对多元多项式L乘以x

{

for(p=L;p;p=p->tp)

{

if(!

p->tag)p->coef*=x;

elseMul(p->hp,x);

}

}//Mul

5.29

voidMPList_Add(MPListA,MPListB,MPList&C)//广义表存储结构的多项式相加的递归算法

{

C=(MPLNode*)malloc(sizeof(MPLNode));

if(!

A->tag&&!

B->tag)//原子项,可直接相加

{

C->coef=A->coef+B->coef;

if(!

C->coef)

{

free(C);

C=NULL;

}

}//if

elseif(A->tag&&B->tag)//两个多项式相加

{

p=A;q=B;pre=NULL;

while(p&&q)

{

if(p->exp==q->exp)

{

C=(MPLNode*)malloc(sizeof(MPLNode));

C->exp=p->exp;

MPList_Add(A->hp,B->hp,C->hp);

pre->tp=C;pre=C;

p=p->tp;q=q->tp;

}

elseif(p->exp>q->exp)

{

C=(MPLNode*)malloc(sizeof(MPLNode));

C->exp=p->exp;

C->hp=A->hp;

pre->tp=C;pre=C;

p=p->tp;

}

else

{

C=(MPLNode*)malloc(sizeof(MPLNode));

C->exp=q->exp;

C->hp=B->hp;

pre->tp=C;pre=C;

q=q->tp;

}

}//while

while(p)

{

C=(MPLNode*)malloc(sizeof(MPLNode));

C->exp=p->exp;

C->hp=p->hp;

pre->tp=C;pre=C;

p=p->tp;

}

while(q)

{

C=(MPLNode*)malloc(sizeof(MPLNode));

C->exp=q->exp;

C->hp=q->hp;

pre->tp=C;pre=C;

q=q->tp;

}//将其同次项分别相加得到新的多项式,原理见第二章多项式相加一题

}//elseif

elseif(A->tag&&!

B->tag)//多项式和常数项相加

{

x=B->coef;

for(p=A;p->tp->tp;p=p->tp);

if(p->tp->exp==0)p->tp->coef+=x;//当多项式中含有常数项时,加上常数项

if(!

p->tp->coef)

{

free(p->tp);

p->tp=NULL;

}

else

{

q=(MPLNode*)malloc(sizeof(MPLNode));

q->coef=x;q->exp=0;

q->tag=0;q->tp=NULL;

p->tp=q;

}//否则新建常数项,下同

}//elseif

else

{

x=A->coef;

for(p=B;p->tp->tp;p=p->tp);

if(p->tp->exp==0)p->tp->coef+=x;

if(!

p->tp->coef)

{

free(p->tp);

p->tp=NULL;

}

else

{

q=(MPLNode*)malloc(sizeof(MPLNode));

q->coef=x;q->exp=0;

q->tag=0;q->tp=NULL;

p->tp=q;

}

}//else

}//MPList_Add

5.30

intGList_Getdeph(GListL)//求广义表深度的递归算法

{

if(!

L->tag)return0;//原子深度为0

elseif(!

L)return1;//空表深度为1

m=GList_Getdeph(L->ptr.hp)+1;

n=GList_Getdeph(L->ptr.tp);

returnm>n?

m:

n;

}//GList_Getdeph

5.31

voidGList_Copy(GListA,GList&B)//复制广义表的递归算法

{

if(!

A->tag)//当结点为原子时,直接复制

{

B->tag=0;

B->atom=A->atom;

}

else//当结点为子表时

{

B->tag=1;

if(A->ptr.hp)

{

B->ptr.hp=malloc(sizeof(GLNode));

GList_Copy(A->ptr.hp,B->ptr.hp);

}//复制表头

if(A->ptr.tp)

{

B->ptr.tp=malloc(sizeof(GLNode));

GList_Copy(A->ptr.tp,B->ptr.tp);

}//复制表尾

}//else

}//GList_Copy

5.32

intGList_Equal(GListA,GListB)//判断广义表A和B是否相等,是则返回1,否则返回0

{//广义表相等可分三种情况:

if(!

A&&!

B)return1;//空表是相等的

if(!

A->tag&&!

B->tag&&A->atom==B->atom)return1;//原子的值相等

if(A->tag&&B->tag)

if(GList_Equal(A->ptr.hp,B->ptr.hp)&&GList_Equal(A->ptr.tp,B->ptr.tp))

return1;//表头表尾都相等

return0;

}//GList_Equal

5.33

voidGList_PrintElem(GListA,intlayer)//递归输出广义表的原子及其所在层次,layer表示当前层次

{

if(!

A)return;

if(!

A->tag)printf("%d%d\n",A->atom,layer);

else

{

GList_PrintElem(A->ptr.hp,layer+1);

GList_PrintElem(A->ptr.tp,layer);//注意尾表与原表是同一层次

}

}//GList_PrintElem

5.34

voidGList_Reverse(GListA)//递归逆转广义表A

{

if(A->tag&&A->ptr.tp)//当A不为原子且表尾非空时才需逆转

{

D=C->ptr.hp;

A->ptr.tp->ptr.hp=A->ptr.hp;A->ptr.hp=D;//交换表头和表尾

GList_Reverse(A->ptr.hp);

GList_Reverse(A->ptr.tp);//逆转表头和表尾

}

}//GList_Reverse

5.35

StatusCreate_GList(GList&L)//根据输入创建广义表L,并返回指针

{

scanf("%c",&ch);

if(ch=='')

{

L=NULL;

scanf("%c",&ch);

if(ch!

=')')returnERROR;

returnOK;

}

L=(GList)malloc(sizeof(GLNode));

L->tag=1;

if(isalphabet(ch))//输入是字母

{

p=(GList)mallo

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 畜牧兽医

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1