数据结构第二章课后答案

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2.4已知顺序表L递增有序,试写一算法,将X插入到线性表的适当位置上,以保持线性表

的有序性。

解:

int InsList(SeqList *L,int X)

{

int i=0,k;

if(L->last>=MAXSIZE-1)

{

printf(" 表已满无法插入!") ;return(ERROR);

} while(i<=L->last&&L->elem[i]

for(k=L->last;k>=I;k--)

L->elem[k+1]=L->elem[k];

L->elem[i]=X;

L->last++;

return(OK);

}

2.5 写一算法,从顺序表中删除自第i 个元素开始的k 个元素。解:

int LDel(Seqlist *L,int i,int k)

{

if(i=1||(i+k>L->last+1))

{

printf(" 输入的i ,k 值不合法") ;return(ERROR);

}

else if(i+k==L->last+2)

{

L->last=i-2;

return OK;

}

else

{

j=i+k-1;

while(j<=L->last)

{

elem[j-k]=elem[j];

j++;

}

L->last=L->last-k+1;

return OK;

2.6 已知线性表中的元素(整数)以递增有序排列,并以单链表作存储结构。试写一高效算法,删除表中所有大于mink 且小于maxk 的元素(若表中存在这样的元素) ,分析你的算法的时间复杂度(注意:mink 和maxk 是给定的两个变量,他们的值为任意的整数) 。解:

int Delete(Linklist,int mink,int maxk)

{

Node *p,*q; p=L;

while(p->next!=NULL)

p=p->next; if(mink>=maxk||L->next->data>=maxk||mink+1=maxk) {

printf(" 参数不合法!");

return ERROR;

}

else

{

while(p->next->data<=mink)

p=p->next;

q=p->next;

while(q->data

{

p->next=q->next;

free(q); q=p->next;

}

return OK;

}

}

2.7 试分别以不同的存储结构实现线性表的就地逆置算法,即在原表的储存空间将线性表(al , al,…,an )逆置为(an, an-1,…,al)。

( 1 )以顺序表作存储结构。

解:

int ReversePosition(SpList L)

{

int k,temp,len;

int j=0;

k=L->last;

len=L->last+1; for(j;j

{

temp=L->elem[k-j]; elem[k-j]=elem[j]; elem[j]=temp;

}

return OK;

}

(2)以单链表作存储结构。

解:

int ReversePosition(Linklist L)

{

Node *NL,q,r;

q=L;

r=L;

NL=L->next;

if(NL==NULL)

return ERROR;

while(q->next!=NULL)

{

q=q->next;

r->next=q;

r=q;

}

while(NL->next!=r&&NL->next!=NULL)

{

q=NL;

while(q->next!=r)

q=q->next;

r->next=q;

r=q;

}

r->next=NL;

NL->next=NULL:

return OK;

}

2.8假设两个按元素值递增有序排列的线性表A和B,均以单链表作为存储结构,请编写算

法,将A表和B表归并成一个按元素值递减的有序排列的线性表C,并要求利用原表(即A

表和B表的)结点空间存放表C

解:

void merge(SepList *LA,SepList *LB,SepList *LC)

{

Node *p1,*p2,*q1,*q2;

LA->next=p1;

LB->next=q1;

while(p1!=NULL&&q1!=NULL)

if(p1->data>q1->data)

{

q2=q1->next;

q1->next=LC->next;

LC->next=q;

q1=q2;

}

else

{

p2=p1->next;

p1->next=LC->next;

LC->next=p1;

p1=p2;

}

}

2.9 假设有一个循环链表的长度大于1,且表中既无头结点也无头指针。已知s 为指向链表

某个结点的指针,试编写算法在链表中删除指针s 所指结点的前驱结点。

解:

ElemType DeletePreElem (Node *s)

{

ElemType temp;

Node *p,*pre;

p=s;

while(p->next!=s)

p=p->next;

pre=p;

while(p->next!=pre)

p=p->next;

p->next=s;

temp=pre->data;

free(pre);

return temp;

}

2.10 已知有单链表表示的线性表中含有三类字符的数据元素(如字母字符、数字字符和其他字符),试

相关文档
最新文档