已知指针la和lb分别指向两个无头结点单链表中的首元结点下列算法是从表la中删除自第i个元素起共len个元素后将它们插入到表lb中第i个元素之前试问此算法是否正确?若有错请改正之
Status DeleteAndInsertSub(LinkedList laLinkedList lbint iint jint len)
{
if(i<||j<||len<) return INFEASIBLE;
p=la;k=;
while(k<i){p=p>next;k++;}
q=p;
while(k<=len){q=q>next;k++;}
s=lb; k=;
while(k<j){s=s>next;k++;}
s>next=p; q>next=s>next;
return OK;
}
解
Status DeleteAndInsertSub(LinkList &laLinkList &lbint iint jint len)
{
LinkList pqsprev=NULL;
int k=;
if(i<||j<||len<) return INFEASIBLE;
// 在la表中查找第i个结点
p=la;
while(p&&k<i){
prev=p;
p=p>next;
k++;
}
if(!p)return INFEASIBLE;
// 在la表中查找第i+len个结点
q=p;k=;
while(q&&k<len){
q=p>next;
k++;
}
if(!q)return INFEASIBLE;
// 完成删除注意i=的情况需要特殊处理
if(!prev) la=q>next;
else prev>next=q>next;
// 将从la中删除的结点插入到lb中
if(j=){
q>next=lb;
lb=p;
}
else{
s=lb;k=;
while(s&&k<j){
s=s>next;
k++;
}
if(!s)return INFEASIBLE;
q>next=s>next;
s>next=p; //完成插入
}
return OK;
}
已知线性表中的元素以值递增有序排列并以单链表作存储结构试写一高效的算法删除表中所有值大于mink且小于maxk的元素(若表中存在这样的元素)同时释放被删结点空间并分析你的算法的时间复杂度(注意mink和maxk是给定的两个参变量它们的值可以和表中的元素相同也可以不同)
解
Status ListDelete_L(LinkList &LElemType minkElemType maxk)
{
LinkList pqprev=NULL;
if(mink>maxk)return ERROR;
p=L;
prev=p;
p=p>next;
while(p&&p>data<maxk){
if(p>data<=mink){
prev=p;
p=p>next;
}
else{
prev>next=p>next;
q=p;
p=p>next;
free(q);
}
}
return OK;
}
同题条件试写一高效的算法删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同)同时释放被删结点空间并分析你的算法的时间复杂度
解
void ListDelete_LSameNode(LinkList &L)
{
LinkList pqprev;
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);
}
}
}