else { p=L; while(--i>1) p=p->next; p->next=p->next->next; //删除第 i 个元素 } }//Delete 2.19 Status Delete_Between(Linklist &L,int mink,int maxk)//删除元素递增排列的链表 L 中值大于 mink 且小于 maxk 的所有元素 { p=L; while(p->next->data<=mink) p=p->next; //p 是最后一个不大于 mink 的元素 if(p->next) //如果还有比 mink 更大的元素 { q=p->next; while(q->data<maxk) q=q->next; //q 是第一个不小于 maxk 的元素 p->next=q; } }//Delete_Between 2.20 Status Delete_Equal(Linklist &L)//删除元素递增排列的链表 L 中所有值相同的元 素 { p=L->next;q=p->next; //p,q 指向相邻两元素 while(p->next) { if(p->data!=q->data) { p=p->next;q=p->next; //当相邻两元素不相等时,p,q 都向后推一步 } else { while(q->data==p->data) { free(q); q=q->next; } p->next=q;p=q;q=p->next; //当相邻元素相等时删除多余元素 }//else
{ pc=pc->next; pc->data=p->data; p=p->next;q=q->next; } }//while }//LinkList_Intersect_True 2.29 void SqList_Intersect_Delete(SqList &A,SqList B,SqList C) { i=0;j=0;k=0;m=0; //i 指示 A 中元素原来的位置,m 为移动后的位置 while(i<A.length&&j<B.length&& k<C.length) { if(B.elem[j]<C.elem[k]) j++; else if(B.elem[j]>C.elem[k]) k++; else { same=B.elem[j]; //找到了相同元素 same while(B.elem[j]==same) j++; while(C.elem[k]==same) k++; //j,k 后移到新的元素 while(i<A.length&&A.elem[i]<same) A.elem[m++]=A.elem[i++]; //需保留的元素移动到新位置 while(i<A.length&&A.elem[i]==same) i++; //跳过相同的元素 } }//while while(i<A.length) A.elem[m++]=A.elem[i++]; //A 的剩余元素重新存储。 A.length=m; }// SqList_Intersect_Delete 分析:先从 B 和 C 中找出共有元素,记为 same,再在 A 中从当前位置开始, 凡小于 same 的 元素均保留(存到新的位置),等于 same 的就跳过,到大于 same 时就再找下一个 same. 2.30 void LinkList_Intersect_Delete(LinkList &A,LinkList B,LinkList C)//在链表结构上 重做上题 { p=B->next;q=C->next;r=A-next; while(p&&q&&r) { if(p->data<q->data) p=p->next;