​单链表的归并操作介绍

 单链表的归并操作介绍:将两个有序单链表归并为一个有序单链表。这里介绍不占用新的空间算法,即以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;
}

运行结果

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DS@数据结构

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值