if(j=1){
q->next=lb; lb=p; } else{
s=lb; k=1; while(s&&k
if(!s)return INFEASIBLE; q->next=s->next;
s->next=p; //完成插入 }
return OK; }
2.17 试写一算法
在无头结点的动态单链表上实现线性表操作Insert(L i b)
并和在带头结点的动态单链表上实现相同操作的算法进行比较
2.18试写一算法
实现线性表操作Delete(L i)
并和在带头结点的动态单链表上实现相同操作的算法进行比较
2.19 已知线性表中的元素以值递增有序排列 并以单链表作存储结构 试写一高效的算法
删除表中所有值大于mink且小于maxk的元素(若表中存在这样的元素) 同时释放被删结点空间
并分析你的算法的时间复杂度(注意 mink和maxk是给定的两个参变量 它们的值可以和表中的元素相同 也可以不同)
解:
Status ListDelete_L(LinkList &L ElemType mink ElemType maxk) {
LinkList p q
prev=NULL;
if(mink>maxk)return ERROR; p=L; prev=p; p=p->next;
while(p&&p->data
prev->next=p->next; q=p;
p=p->next; free(q); } }
return OK; }
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); } }
}
2.21 试写一算法
实现顺序表的就地逆置
即利用原表的存储空间将线性表逆置为
解:
// 顺序表的逆置
Status ListOppose_Sq(SqList &L) {
int i;
ElemType x;
for(i=0;i L.elem[i]=L.elem[L.length-1-i]; L.elem[L.length-1-i]=x; } return OK; } 2.22 试写一算法 对单链表实现就地逆置 解: // 带头结点的单链表的逆置 Status ListOppose_L(LinkList &L) { LinkList p q; p=L; p=p->next; L->next=NULL; while(p){ q=p; p=p->next; q->next=L->next; L->next=q; } return OK; } 2.23 设线性表 试写一个按下列规则合并A B为线性表C的算法 即使得 当时; 当时 线性表A B和C均以单链表作存储结构 且C表利用A表和B表中的结点空间构成 注意:单链表的长度值m和n均未显式存储 解: // 将合并后的结果放在C表中 并删除B表 Status ListMerge_L(LinkList &A LinkList &B LinkList &C) { LinkList pa pb qa qb; pa=A->next; pb=B->next; C=A; while(pa&&pb){ qa=pa; qb=pb; pa=pa->next; pb=pb->next; qb->next=qa->next; qa->next=qb; } if(!pa)qb->next=pb; pb=B; free(pb); return OK; } 2.24 假设有两个按元素值递增有序排列的线性表A和B 均以单链表作存储结构 请编写算法将A表和B表归并成一个按元素值递减有序(即非递增有序 允许表中含有值相同的元素)排列的线性表C 并要求利用原表(即A表和B表)的结点空间构造C表 解: // 将合并逆置后的结果放在C表中 并删除B表 Status ListMergeOppose_L(LinkList &A LinkList &B LinkList &C)