数据结构作业系统答案文档格式.docx

上传人:b****5 文档编号:17023751 上传时间:2022-11-27 格式:DOCX 页数:43 大小:26.64KB
下载 相关 举报
数据结构作业系统答案文档格式.docx_第1页
第1页 / 共43页
数据结构作业系统答案文档格式.docx_第2页
第2页 / 共43页
数据结构作业系统答案文档格式.docx_第3页
第3页 / 共43页
数据结构作业系统答案文档格式.docx_第4页
第4页 / 共43页
数据结构作业系统答案文档格式.docx_第5页
第5页 / 共43页
点击查看更多>>
下载资源
资源描述

数据结构作业系统答案文档格式.docx

《数据结构作业系统答案文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构作业系统答案文档格式.docx(43页珍藏版)》请在冰豆网上搜索。

数据结构作业系统答案文档格式.docx

=空表,

则A=B;

=空表,而B'

≠空表,或者两者均不为空表,

且A'

的首元小于B'

的首元,则A<

B;

否则A>

B。

试写一个比

较A和B大小的算法。

(注意:

在算法中,不要破坏原表A

和B,也不一定先求得A'

才进行比较)。

charCompare(SqListA,SqListB);

/*比较顺序表A和B,*/

/*返回'

<

'

若A<

B;

*/

/*'

='

若A=B;

>

若A>

B*/

charCompare(SqListA,SqListB)

//比较顺序表A和B,

//返回'

//'

B

inti=0;

while(A.elem[i]==B.elem[i]&

A.length&

B.length)

if(i==A.length&

i==B.length)

return'

;

elseif(A.elem[i]<

B.elem[i]||i==A.length)

elseif(A.elem[i]>

B.elem[i]||i==B.length)

2.13②试写一算法在带头结点的单链表结构上实现线性表操作

Locate(L,x)。

实现下列函数:

LinkListLocate(LinkListL,ElemTypex);

//If'

x'

inthelinkedlistwhoseheadnodeispointed

//by'

L'

thenreturnpointerpointingnode'

//otherwisereturn'

NULL'

单链表类型定义如下:

typedefstructLNode{

ElemTypedata;

structLNode*next;

}LNode,*LinkList;

LinkListLocate(LinkList&

inthelinkedlistwhoseheadnodeispointed

thenreturnpointerhapointingnode'

LinkListp;

p=L->

next;

while(p->

data!

=x&

p!

=NULL)

p=p->

}

returnp;

2.14②试写一算法在带头结点的单链表结构上实现线性表

操作Length(L)。

intLength(LinkListL);

//Returnthelengthofthelinkedlist

//whoseheadnodeispointedby'

typedefstructLNode{

intLength(LinkListL)

while(p!

returni;

2.17②试写一算法,在无头结点的动态单链表上实现

线性表操作INSERT(L,i,b),并和在带头结点的动态单

链表上实现相同操作的算法进行比较。

voidInsert(LinkList&

L,inti,ElemTypeb);

L,inti,ElemTypeb)

LinkListp,q;

intj=2;

p=L;

while(j<

i)

j++;

if(i!

=0&

i!

=1)

q=(LinkList)malloc(sizeof(LNode));

q->

data=b;

next=p->

p->

next=q;

if(i==1)

next=p;

L=q;

2.18②同2.17题要求。

试写一算法,

实现线性表操作DELETE(L,i)。

voidDelete(LinkList&

L,inti);

L,inti)

i&

q=p->

next=q->

free(q);

q=L;

L=L->

2.20②同2.19题条件,试写一高效的算法,删除表中所

有值相同的多余元素(使得操作后的线性表中所有元素的

值均不相同)同时释放被删结点空间,并分析你的算法的

时间复杂度。

voidPurge(LinkList&

L);

L)

=NULL&

p->

next!

if(p->

data==p->

next->

data)

else

◆2.21③试写一算法,实现顺序表的就地逆置,

即利用原表的存储空间将线性表(a1,a2,…,an)

逆置为(an,an-1,…,a1)。

voidInverse(SqList&

inti=0,j=0;

i=L.length/2;

for(j=0;

j<

j++)

ElemTypee=L.elem[j];

L.elem[j]=L.elem[L.length-j-1];

L.elem[L.length-j-1]=e;

◆2.22③试写一算法,对单链表实现就地逆置。

voidInverse(LinkList&

/*对带头结点的单链表L实现就地逆置*/

L)

LinkListp,q,k;

q=p=L->

k=q;

next=k;

L->

2.23③设线性表A=(a1,...,am),B=(b1,...,bn),试写

一个按下列规则合并A、B为线性表C的算法,即使得

C=(a1,b1,...,am,bm,bm+1,...,bn)当m≤n时;

或者C=(a1,b1,...,an,bn,an+1,...,am)当m>n时。

线性表A、B和C均以单链表作存储结构,且C表利用A表和

B表中的结点空间构成。

注意:

单链表的长度值m和n均未

显式存储。

voidMerge(LinkListha,LinkListhb,LinkList&

hc)

/*依题意,合并带头结点的单链表ha和hb为hc*/

LinkListp,q,k,r;

p=ha->

q=hb->

if(p==NULL)hc=hb;

elseif(q==NULL)hc=ha;

q->

k=p->

r=q->

p=k;

q=r;

hc=ha;

◆2.24④假设有两个按元素值递增有序排列的线性表

A和B,均以单链表作存储结构,请编写算法将A表和B表

归并成一个按元素值递减有序(即非递增有序,允许表

中含有值相同的元素)排列的线性表C,并要求利用原

表(即A表和B表)的结点空间构造C表。

voidUnion(LinkList&

lc,LinkListla,LinkListlb);

/*依题意,利用la和lb原表的结点空间构造lc表*/

lc,LinkListla,LinkListlb)

LinkListpa=la->

LinkListpb=lb->

LinkListpre=NULL;

LinkListq,pc;

while(pa||pb)

if((pa->

data<

pb->

data&

pa!

=NULL)||pb==NULL)

pc=pa;

q=pa->

pa->

next=pre;

pa=q;

{

pc=pb;

q=pb->

pb->

pb=q;

pre=pc;

printf("

%s"

"

done"

);

lc=la;

la->

next=pc;

//构造新表头

/*LinkListpa=la->

LinkListpb=lb->

LinkListpc=la;

lc=la;

while(pa&

pb)

if(pa->

data<

=pb->

data)

pc->

next=pa;

pc=pa;

pa=pa->

next=pb;

pc=pb;

pb=pb->

next=pa?

pa:

pb;

free(lb);

//将c实现就地逆置'

p=lc->

while(p->

next)

q=p->

next=p->

next=lc->

lc->

next=q;

2.31②假设某个单向循环链表的长度大于1,且表

中既无头结点也无头指针。

已知s为指向链表中某个

结点的指针,试编写算法在链表中删除指针s所指结

点的前驱结点。

ElemTypeDeleteNode(LinkLists);

/*删除指针s所指结点的前驱结点,并返回被删结点的元素值*/

ElemTypeDeleteNode(LinkLists)

p=s->

=s)

ElemTypee=p->

data;

next=s;

returne;

2.32②已知有一个单向循环链表,其每个结点中

含三个域:

prev、data和next,其中data为数据域,

next为指向后继结点的指针域,prev也为指针域,

但它的值为空(NULL),试编写算法将此单向循环链

表改为双向循环链表,即使prev成为指向前驱结点

的指针域。

voidPerfectBiLink(BiLinkList&

CL);

双向循环链表类型定义如下:

typedefstructBiNode{

intfreq;

//2.38题用

structBiNode*prev,

*next;

}BiNode,*BiLinkList;

CL)

BiLinkListp,q,k;

k=p=q=CL;

=q)

prev=k;

k=p;

prev=p;

◆2.33③已知由一个线性链表表示的线性表中含有

三类字符的数据元素(如:

字母字符、数字字符和其

它字符),试编写算法将该线性链表分割为三个循环

链表,其中每个循环链表表示的线性表中均只含一类

字符。

voidSplit(LinkList&

lc,LinkList&

ld,LinkList&

lo,LinkListll);

A,LinkList&

B,LinkList&

C,LinkListL)

LinkLists,p,q,r;

s=L->

A=(LinkList)malloc(sizeof(LNode));

p=A;

B=(LinkList)malloc(sizeof(LNode));

q=B;

C=(LinkList)malloc(sizeof(LNode));

r=C;

//建立头结点

while(s)

if((s->

data>

a'

s->

z'

)||(s->

Z'

))

p=s;

elseif(s->

0'

9'

q=s;

r->

r=s;

s=s->

}//while

next=A;

next=B;

r->

next=C;

//完成循环链表

2.37④设以带头结点的双向循环链表表示的线性

表L=(a1,a2,...,an)。

试写一时间复杂度为O(n)的

算法,将L改造为L=(a1,a3,...,an,...,a4,a2)。

voidReverseEven(BiLinkList&

BiLinkListp=NULL;

=L&

=L)

}//此时p指向最后一个奇数结点

next==L)p->

next=L->

prev->

prev;

elsep->

//此时p指向最后一个偶数结点

prev!

if(p!

next=L;

//按题目要求调整了next链的结构,此时pre链仍为原状

for(p=L;

=L;

p=p->

next)p->

//调整pre链的结构,同2.32方法

◆2.39③试对稀疏多项式Pn(x)采用存储量同多项式项

数m成正比的顺序存储结构,编写求Pn(x0)的算法(x0为

给定值),并分析你的算法的时间复杂度。

floatEvaluate(SqPolypn,floatx);

/*pn.data[i].coef存放ai,*/

/*pn.data[i].exp存放ei(i=1,2,...,m)*/

/*本算法计算并返回多项式的值。

不判别溢出。

/*入口时要求0≤e1<

e2<

...<

em,算法内不对此再作验证*/

多项式的顺序存储结构:

intcoef;

intexp;

}PolyTerm;

PolyTerm*data;

}SqPoly;

floatf(floatx,intj)

inti;

floats=1;

for(i=0;

i<

j;

++i){

s*=x;

returns;

floatEvaluate(SqPolypn,floatx)

floats=0;

for(i=0;

pn.length;

s+=pn.data[i].coef*f(x,pn.data[i].exp);

◆2.41②试以循环链表作稀疏多项式的存储结构,

编写求其导函数的算法,要求利用原多项式中的结

点空间存放其导函数(多项式),同时释放所有无

用(被删)结点。

voidDifference(LinkedPoly&

pa);

/*稀疏多项式pa以循环链表作存储结构,*/

/*将此链表修改成它的导函数,并释放无用结点*/

链式多项式的类型定义:

typedefstructPolyNode{

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

当前位置:首页 > 教学研究 > 教学反思汇报

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

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