2.22
voidLinkList_reverse(Linklist&L)//链表的就地逆置;为简化算法,
假设表长大于2
{
p=L->next;q=p->next;s=q->next;p->next=NULL;
while(s->next)
{
q->next=p;p=q;
q=s;s=s->next;//把L的元素逐个插入新表表头
}
q->next=p;s->next=q;L->next=s;
}//LinkList_reverse
分析:本算法的思想是,逐个地把L的当前元素q插入新的链表头部,p为新
表表头.
2.23
voidmerge1(LinkList&A,LinkList&B,LinkList&C)//把链表A和B合
并为C,A和B的元素间隔排列,且使用原存储空间
{
p=A->next;q=B->next;C=A;
while(p&&q)
{
s=p->next;p->next=q;//将B的元素插入
if(s)
{
t=q->next;q->next=s;//如A非空,将A的元素插入
}
p=s;q=t;
}//while
}//merge1
2.24
voidreverse_merge(LinkList&A,LinkList&B,LinkList&C)//把元素
递增排列的链表A和B合并为C,且C中元素递减排列,使用原空间
{
pa=A->next;pb=B->next;pre=NULL;//pa和pb分别指向A,B的当前元素
while(pa||pb)
{
if(pa->data<pb->data||!pb)
{
pc=pa;q=pa->next;pa->next=pre;pa=q;//将A的元素插入新表
}
else
{
pc=pb;q=pb->next;pb->next=pre;pb=q;//将B的元素插入新表
}
pre=pc;
}
C=A;A->next=pc;//构造新表头
}//reverse_merge
分析:本算法的思想是,按从小到大的顺序依次把A和B的元素插入新表的
头部pc处,最后处理A或B的剩余元素.
2.25
voidSqList_Intersect(SqListA,SqListB,SqList&C)//求元素递增
排列的线性表A和B的元素的交集并存入C中
{
i=1;j=1;k=0;
while(A.elem[i]&&B.elem[j])
{
if(A.elem[i]<B.elem[j])i++;
if(A.elem[i]>B.elem[j])j++;
if(A.elem[i]==B.elem[j])
{
C.elem[++k]=A.elem[i];//当发现了一个在A,B中都存在的元素,
i++;j++;//就添加到C中
}
}//while
}//SqList_Intersect
2.26
voidLinkList_Intersect(LinkListA,LinkListB,LinkList&C)//在
链表结构上重做上题
{
p=A->next;q=B->next;
pc=(LNode*)malloc(sizeof(LNode));
while(p&&q)
{
if(p->data<q->data)p=p->next;
elseif(p->data>q->data)q=q->next;
else
{
s=(LNode*)malloc(sizeof(LNode));
s->data=p->data;
pc->next=s;pc=s;
p=p->next;q=q->next;
}
}//while
C=pc;
}//LinkList_Intersect
2.27
voidSqList_Intersect_True(SqList&A,SqListB)//求元素递增排列
的线性表A和B的元素的交集并存回A中
{
i=1;j=1;k=0;
while(A.elem[i]&&B.elem[j])
{
if(A.elem[i]<B.elem[j])i++;
elseif(A.elem[i]>B.elem[j])j++;
elseif(A.elem[i]!=A.elem[k])
{
A.elem[++k]=A.elem[i];//当发现了一个在A,B中都存在的元素
i++;j++;//且C中没有,就添加到C中
}
}//while
while(A.elem[k])A.elem[k++]=0;
}//SqList_Intersect_True
2.28
voidLinkList_Intersect_True(LinkList&A,LinkListB)//在链表结
构上重做上题
{
p=A->next;q=B->next;pc=A;
while(p&&q)
{
if(p->data<q->data)p=p->next;
elseif(p->data>q->data)q=q->next;
elseif(p->data!=pc->data)
{
pc=pc->next;
pc->data=p->data;
p=p->next;q=q->next;
}
}//while
}//LinkList_Intersect_True
2.29
voidSqList_Intersect_Delete(SqList&A,SqListB,SqListC)
{
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++;
elseif(B.elem[j]>C.elem[k])k++;
else
{
same=B.elem[j];//找到了相同元素same
while(B.elem[j]==same)j++;
评论30
最新资源