数据结构习题及答案
源代码在线查看: 2.16.c
2.16③ 已知指针la和lb分别指向两个无头结点单链表中
的首元结点。 下列算法是从表la中删除自第i个元素起共
len个元素后,将它们插入到表lb中第i个元素之前。试问
此算法是否正确? 若有错,则请改正之。
实现下列函数:
Status DeleteAndInsertSub(LinkList &la, LinkList &lb,
int i, int j, int len);
// la和lb分别指向两个单链表中第一个结点, */
/* 本算法是从la表中删去自第i个元素起共len个元素,*/
/* 并将它们插入到lb表中第j个元素之前, */
/* 若lb表中只有j-1个元素,则插在表尾。 */
单链表类型定义如下:
typedef struct LNode{
ElemType data;
struct LNode *next;
} LNode, *LinkList;
Status DeleteAndInsertSub(LinkList &la, LinkList &lb,
int i, int j, int len)
// la和lb分别指向两个单链表中第一个结点, */
/* 本算法是从la表中删去自第i个元素起共len个元素,*/
/* 并将它们插入到lb表中第j个元素之前, */
/* 若lb表中只有j-1个元素,则插在表尾。 */
{
LinkList p,q,s,prev;
int k;
if(i p=la;k=1;
while(p&&k {
prev=p;p=p->next;k++;
}
if(!p) return INFEASIBLE;
q=p;k=1;
while(q&&k {
q=q->next;k++;
}
if(!q) return INFEASIBLE;
if(i==1) la=q->next;
else prev->next=q->next;
if(j==1){q->next=lb; lb=p;}
else{
s=lb;k=1;
while(s&&knext;k++;}
if(!s) return INFEASIBLE;
q->next=s->next;s->next=p;
}
return OK;
}