Status DeleteAndInsertSub(LinkList &la,LinkList &lb,int i,int j,int len) { }
2.17 试写一算法,在无头结点的动态单链表上实现线性表操作Insert(L,i,b),并和在带头结点的动态单链表上实现相同操作的算法进行比较。
2.18试写一算法,实现线性表操作Delete(L,i),并和在带头结点的动态单链表上实现相同操作的算法进行比较。
LinkList p,q,s,prev=NULL; int k=1;
if(i<0||j<0||len<0) return INFEASIBLE; // 在la表中查找第i个结点 p=la;
while(p&&k
if(!p)return INFEASIBLE;
// 在la表中查找第i+len-1个结点 q=p; k=1; while(q&&k if(!q)return INFEASIBLE; // 完成删除,注意,i=1的情况需要特殊处理 if(!prev) la=q->next; else prev->next=q->next; // 将从la中删除的结点插入到lb中 if(j=1){ } else{ } return OK; s=lb; k=1; q->next=lb; lb=p; q=p->next; k++; prev=p; p=p->next; k++; while(s&&k if(!s)return INFEASIBLE; q->next=s->next; s->next=p; //完成插入 s=s->next; k++; 2.19 已知线性表中的元素以值递增有序排列,并以单链表作存储结构。试写一高效的算法,删除表中所有值大于mink且小于maxk的元素(若表中存在这样的元素),同时释放被删结点空间,并分析你的算法的时间复杂度(注意,mink和maxk是给定的两个参变量,它们的值可以和表中的元素相同,也可以不同)。 解: Status ListDelete_L(LinkList &L,ElemType mink,ElemType maxk) { } 2.20 同2.19题条件,试写一高效的算法,删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同),同时释放被删结点空间,并分析你的算法的时间复杂度。 解: void ListDelete_LSameNode(LinkList &L) { LinkList p,q,prev; p=L; prev=p; p=p->next; while(p){ } prev=p; p=p->next; if(p&&p->data==prev->data){ } prev->next=p->next; q=p; p=p->next; free(q); LinkList p,q,prev=NULL; if(mink>maxk)return ERROR; p=L; prev=p; p=p->next; while(p&&p->data return OK; if(p->data<=mink){ } else{ } prev->next=p->next; q=p; p=p->next; free(q); prev=p; p=p->next; } 2.21 试写一算法,实现顺序表的就地逆置,即利用原表的存储空间将线性表?a1,?,an?逆置为 ?an,?,a1?。 解: // 顺序表的逆置 Status ListOppose_Sq(SqList &L) { } 2.22 试写一算法,对单链表实现就地逆置。 解: // 带头结点的单链表的逆置 Status ListOppose_L(LinkList &L) { } 2.23 设线性表A??a1,a2,?,am?,B??b1,b2,?,bn?,试写一个按下列规则合并A,B为线性表C的算法,即使得 LinkList p,q; p=L; p=p->next; L->next=NULL; while(p){ } return OK; q=p; p=p->next; q->next=L->next; L->next=q; int i; ElemType x; for(i=0;i return OK; x=L.elem[i]; L.elem[i]=L.elem[L.length-1-i]; L.elem[L.length-1-i]=x; 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均未显式存储。 解: // 将合并后的结果放在C表中,并删除B表 Status ListMerge_L(LinkList &A,LinkList &B,LinkList &C) { } 2.24 假设有两个按元素值递增有序排列的线性表A和B,均以单链表作存储结构,请编写算法将A表和B表归并成一个按元素值递减有序(即非递增有序,允许表中含有值相同的元素)排列的线性表C,并要求利用原表(即A表和B表)的结点空间构造C表。 解: // 将合并逆置后的结果放在C表中,并删除B表 Status ListMergeOppose_L(LinkList &A,LinkList &B,LinkList &C) { LinkList pa,pb,qa,qb; pa=A; pb=B; qa=pa; qb=pb; // 保存pa的前驱指针 // 保存pb的前驱指针 LinkList pa,pb,qa,qb; pa=A->next; pb=B->next; C=A; while(pa&&pb){ } if(!pa)qb->next=pb; pb=B; free(pb); return OK; qa=pa; qb=pb; pa=pa->next; pb=pb->next; qb->next=qa->next; qa->next=qb; pa=pa->next; pb=pb->next; A->next=NULL; C=A; while(pa&&pb){ if(pa->data qb=pb; qa=pa; pa=pa->next; qa->next=A->next; //将当前最小结点插入A表表头 A->next=qa; } } } pb=pb->next; qb->next=A->next; //将当前最小结点插入A表表头 A->next=qb; while(pa){ } while(pb){ } pb=B; free(pb); return OK; qb=pb; pb=pb->next; qb->next=A->next; A->next=qb; qa=pa; pa=pa->next; qa->next=A->next; A->next=qa; 2.25 假设以两个元素依值递增有序排列的线性表A和B分别表示两个集合(即同一表中的元素值各不相同),现要求另辟空间构成一个线性表C,其元素为A和B中元素的交集,且表C中的元素有依值递增有序排列。试对顺序表编写求C的算法。 解: // 将A、B求交后的结果放在C表中 Status ListCross_Sq(SqList &A,SqList &B,SqList &C) { } 2.26 要求同2.25题。试对单链表编写求C的算法。 解: // 将A、B求交后的结果放在C表中,并删除B表 int i=0,j=0,k=0; while(i return OK; if(A.elem[i] if(A.elem[i]>B.elem[j]) j++; else{ } ListInsert_Sq(C,k,A.elem[i]); i++; k++; 百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库数据结构及应用算法 课后复习题(附答案 严蔚敏版)(4)在线全文阅读。
相关推荐: