}
node*formalMerge(node*headA,node*headB)//合并有序表
{
node*head=newnode;
head->next=NULL;
node*p=headA->next;
node*q=headB->next;
if(p==NULL)
{
returnheadB;
}
if(q==NULL)
{
returnheadA;
}
while((p!
=NULL)&&(q!
=NULL))
{
if(p->value==q->value)
{
insertNode(head,p->value);
insertNode(head,q->value);
p=p->next;
q=q->next;
}
elseif(p->valuevalue)
{
insertNode(head,p->value);
p=p->next;
}
elseif(p->value>q->value)
{
insertNode(head,q->value);
q=q->next;
}
}
while(p!
=NULL)
{
insertNode(head,p->value);
p=p->next;
}
while(q!
=NULL)
{
insertNode(head,q->value);
q=q->next;
}
returnhead;
}
voidchg2sort(node*head,node*&p)
{
if(head->next==NULL)//没有节点,直接返回
{
return;
}
node*s=head;
while(s->next!
=p)//s指向p的前一个节点
{
s=s->next;
}
//下面的一段找到第一个大于p节点值的节点
node*q=p;
node*r=q;
while(q!
=NULL)
{
if(q->value<=p->value)
{
r=q;//r始终指向q的前一个节点
q=q->next;
}
else
{
break;
}
}
//下面调整指针,其实可以统一写出来,为了阅读清晰把q为NULL和非NULL分开写出来
if(q==NULL)
{
r->next=p;
s->next=p->next;
p->next=NULL;
}
elseif(q!
=NULL)
{
s->next=p->next;
r->next=p;
p->next=q;
}
//由于链表进行了调换,当前链表指针也需要改变
p=s->next;
}
/*两个有序链表进行合并*/
node*merge(node*head1,node*head2)
{
node*head;//合并后的头指针
node*p=head1->next;
node*q=head2->next;
//有一个链表为空的情况,直接返回另一个链表
if(p==NULL)
{
head=head2;
returnhead;
}
elseif(q==NULL)
{
head=head1;
returnhead;
}
//两个都不为空,先确定哪个链表作为合并后的链表
if((p!
=NULL)&&(q!
=NULL))
{
if(p->valuevalue)
{
head=head1;
}
else
{head=head2;
}
}
node*p_prior;//始终指向p节点的前一个节点
node*q_prior;
while((p!
=NULL)&&(q!
=NULL))
{
if(p->valuevalue)
{
if(head==head1)
{
p_prior=p;
p=p->next;
}
elseif(head==head2)
{
//进行当前节点值的交换
inttmp=p->value;
p->value=q->value;
q->value=tmp;
chg2sort(head1,p);//交换元素后的调整
q_prior=q;
q=q->next;
}
}
elseif(p->value==q->value)
{
p_prior=p;
p=p->next;
q_prior=q;
q=q->next;
}
elseif(p->value>q->value)
{
if(head==head1)
{
inttmp=p->value;
p->value=q->value;
q->value=tmp;
chg2sort(head2,q);
p_prior=p;
p=p->next;
}
elseif(head==head2)
{
q_prior=q;
q=q->next;
}
}
}
if(p!
=NULL)
{
q_prior->next=p;
}
if(q!
=NULL)
{
p_prior->next=q;
}
returnhead;
}
intmain()
{
inta[5]={1,5,8,11,19};//建立有序链表A
node*headA=newnode;
headA->next=NULL;
for(inti=0;i<5;++i)
{
insertNode(headA,a[i]);
}
cout<<"有序表a为:
"<print(headA);
intb[3]={3,4,6};//建立有序链表B
node*headB=newnode;
headB->next=NULL;
for(intj=0;j<3;++j)
{
insertNode(headB,b[j]);
}
cout<<"有序表b为:
"<print(headB);
node*head=formalMerge(headA,headB);
head=merge(headA,headB);
cout<<"合并后的有序表为:
"<print(head);
return0;
}
4.运行结果:
实验心得:
约瑟夫问题开始比较难理解,通过算法来转换为程序有一定的困难,需要认真分析每一步。
第二个程序比较长,打起来都比较费时,平时应该加强练习打代码。