单链表的归并操作介绍:将两个有序单链表归并为一个有序单链表。这里介绍不占用新的空间算法,即以La的头结点作为Lc的头结点
有两种情况:1.归并后含重复元素
2.归并后不含重复元素(元素相等时特殊处理,不进行连接,使两表指针都继续指向下一个结点)
//有序单链表的归并:
算法思想:
1.两表元素循环相比较,指针指向首元结点,pc指向a的头结点
2.进行有序连接
3.判断哪一个表先扫描结束,连接另一个表,释放Lb
代码:
//----归并后包含重复的元素
void Merge_List_re(LinkList &La, LinkList &Lb, LinkList &Lc)
{
LNode *pa, *pb,*pc;
Lc=pc=La;
pa=pa->next;
pb=pb->next;
while(pa!=NULL&&pb!=NULL)
{
if(pa->data<=pb->data)
{
pc->next=pa;
pc=pa;
pa=pa->next;
}
else
{
pc->next=pb;
pc=pb;
pb=pb->next;
}
}
pc->next=pa?pa:pb;
free(Lb);
}
//归并后不含重复元素(元素相等时特殊处理,不进行连接,使两表指针都继续指向下一个结点)
代码:
void Merge_List_re(LinkList &La, LinkList &Lb, LinkList &Lc)
{
LNode *pa, *pb,*pc;
Lc=pc=La;
pa=pa->next;
pb=pb->next;
while(pa!=NULL&&pb!=NULL)
{
if(pa->data<pb->data)
{
pc->next=pa;
pc=pa;
pa=pa->next;
}
else if(pa->data == pb->data)
{
pc-next=pa;
pc=pa;
pa=pa->next;
pb=pb->next;
}
else
{
pc->next=pb;
pc=pb;
pb=pb->next;
}
}
pc->next=pa?pa:pb;
free(Lb);
}
//补充:
以上代码:pc->next=pa?pa:pb;是判断哪一个表先扫描结束,最后连接另一个表,释放Lb
也可以采用if语句
if(pa!NULL) //说明Lb表先扫面完
pc->data=pa; //最后连接La表的剩余元素
if(pb!NULL) //说明La表先扫面完
pc->next=pb; //最后连接Lb表的剩余元素
完整代码
#include<stdio.h>
#include<stdlib.h>
/*------------------数据结构代码--------------------*/
/*------------------单链表部分------------------------*/
#define TRUE 1
#define FALSE 0
//单链表的定义
//typedef struct ElemType
typedef struct LNode{
int data;
struct LNode *next;
}LNode, *LinkList;
//单链表的初始化
void Init_LinkList(LinkList &L)
{
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
}
//建立单链表--头插法
/*bool Create_LinkList_head(LinkList &L)
{
int x=0;
LNode *p,*s;
p=L;
scanf("%d",&x);
while(x!=9999)
{
s=(LNode *)malloc(sizeof(LNode));
if(s==NULL)
printf("内存分配失败!");
s->data=x;
s->next=p->next;
p->next=s;
scanf("%d",&x);
}
return TRUE;
}*/
//建立单链表--尾插法
int Cre_Link(LinkList &L)
{
int x=0;
LNode *s,*r;
r=L;
scanf("%d",&x);
while(x!=9999)
{
s=(LNode *)malloc(sizeof(LNode));
if(s==NULL)
printf("内存分配失败!");
s->data=x;
r->next=s;
r=s;
scanf("%d",&x);
}
r->next=NULL;
return TRUE;
}
//输出链表元素
int Print_LinkList(LinkList L)
{
LNode *p;
p=L->next;
while(p!=NULL)
{
printf("%d\n",p->data);
p=p->next;
}
return TRUE;
}
//合并有序链表--包含重复元素
/*
算法思想:
1.定义两个指针分别指向头结点
2.让c表头结点也a的头结点,pc指向头结点
2.循环比较表元素,实现有序连接
*/
/*void Merge_List_chongfu(LinkList &La,LinkList &Lb,LinkList &Lc)
{
LNode *pa,*pb,*pc;
Lc=pc=La;
pa=La->next;
pb=Lb->next;
while(pa&&pb)
{
if(pa->data<=pb->data) //连pa
{
pc->next=pa;
pc=pa;
pa=pa->next;
}
else
{
pc->next=pb;
pc=pb;
pb=pb->next;
}
}
//pc->next=pa?pa:pb;//---若用if语句
if(pa!=NULL)
pc->next=pa;
if(pb!=NULL)
pc->next=pb;
free(Lb);
}
*/
//合并有序链表--不包含重复元素
/*
算法思想:
1.定义两个指针分别指向头结点
2.让c表头结点也a的头结点,pc指向头结点
2.循环比较表元素,实现有序连接
*/
void Merge_List_bucho(LinkList &La,LinkList &Lb,LinkList &Lc)
{
LNode *pa,*pb,*pc;
Lc=pc=La;
pa=La->next;
pb=Lb->next;
while(pa&&pb)
{
if(pa->data < pb->data) //连pa
{
pc->next=pa;
pc=pa;
pa=pa->next;
}
else if(pa->data == pb->data)
{
pc->next=pa;
pc=pa;
pa=pa->next;
pb=pb->next;
}
else
{
pc->next=pb;
pc=pb;
pb=pb->next;
}
}
//pc->next=pa?pa:pb;//---若用if语句
if(pa!=NULL)
pc->next=pa;
if(pb!=NULL)
pc->next=pb;
free(Lb);
}
int main()
{
LinkList La,Lb,Lc;
int x=0;
Init_LinkList(La);
printf("请输入La链表元素:");
//Create_LinkList_head(L); --头插法函数
Cre_Link(La);
printf("La链表中的元素为:\n");
Print_LinkList(La);
Init_LinkList(Lb);
printf("请输入Lb链表元素:");
//Create_LinkList_head(L); --头插法函数
Cre_Link(Lb);
printf("Lb链表中的元素为:\n");
Print_LinkList(Lb);
Merge_List_bucho(La,Lb,Lc);
printf("归并为Lc链表中的元素为:\n");
Print_LinkList(Lc);
return 0;
}