已知指针La和Lb分别是两个带头结点单链表的头指针,下列算法是将表La的第i个元素起的len个元素删除并插入到表Lb的第j(j>=1)个元素之前,试问此算法是否正确?若有错请改正。
void insertsublist(LNode * La,LNode * Lb,int i,int j,int len){
pre=La;
pa=La->next;
k=1;
while(k<1){
p=p->next;
k=k+1;
}
s=p;
while(k<len){
s=s->next;
k=k+1;
}
pre->next=s->next;
q=Lb,k=0;
while(k<j){
q=q->next;
k=k+1;
}
q->next=p;
s->next=q->next;
}
代码中存在错误。
(1)为删除La的第i个元素起的len个元素,需要保存第i个元素结点前驱结点的指针。
(2)k在3个循环中的作用是类似的,都是用于累计本次循环中已扫描的元素结点的个数,所以进入第二个循环之前,k要重新赋值,即k=1;
(3)为将子表插在表Lb的第j(j>=1)个元素之前,需要修改Lb的第j-1个元素结点的指针,故第三个循环的循环条件为k<j-1;
(4)将子表插入到表Lb中,修改指针的顺序有误。
void insertsub(LNode * La,LNode * Lb,int i,int j,int len){
pre=La; // pre指向la的头结点
p=La->next; // p指向La头结点后的第一个元素
k=1; // 遍历到La的第i-1个元素,pre指向第i-1个元素,p指向La第i个元素
while(k<i){
pre=p;
p=p->next;
k=k+1;
}
s=p; // s指向La的第i个元素
k=1;
while(k<len){
s=s->next;
k=k+1;
}
pre->next=s->next; // 删除从La的第i个元素起的后len个
q=Lb; // q指向Lb的头结点
k=0;
while(k<j-1){ // 令q指向Lb的第j-1个元素
q=q->next;
k=k+1;
}
s->next=q->next; // 将La的第i+len-1个元素插入Lb的第j个元素之前
q->next=p;
}