链表之单链表的合并

本文介绍了如何合并两个链表,特别是有序链表的合并。在处理链表合并时,需要考虑链表为空的情况,以及当两个链表都不为空时如何进行有效合并。通过找到链表1的末尾并连接链表2的头部,可以实现合并,之后可以使用排序算法(如冒泡排序或选择排序)确保合并后的链表有序。提供了相应的MergeList.h和MergeList.c文件作为实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

合并两个链表,顾名思义至少得有两个链表,比如说:链表1:0->2->4->7->9->over  ; 链表2:9->3->5->8->over,要想合并这两个链表我们需要注意哪些问题呢?

我们至少需要考虑以下几个问题:

(1)对于其中有一个链表为空这种问题还是比较好处理得,直接返回不为空的那个链表就可以了;

(2)如果两个链表均不为空,合并时我们该如何处理呢?最简单的一种解决办法是:

    先找到表1的最后一个结点,然后找到链表2的表头指针,最后将表1的尾和表2的头相连即可,要想得到有序       的合并链表,那么我们只需要在最后调用一次排序函数就可以了,本次提供了冒泡排序选择排序.

   这种方法对有序链表和无需链表的合并都适用。


MergeList.h

#ifndef __MERGELIST_H_
#define __MERGELIST_H_

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

typedef int DataType;

typedef struct LinkNode
{
	DataType Data;         //结点的数据信息
	struct LinkNode *next; //结点的指针域,后继指针
}LinkNode,*pLinkNode;

typedef struct LinkList
{
	LinkNode *pHead;
}LinkList,*pLinkList;


void InitList(pLinkList pList);      //初始化链表
void PrintList(pLinkList pList);     //打印链表
void Destroy(pLinkList pList);       //销毁链表
void PushBack(pLinkList pList,DataType x);  //尾插
pLinkNode MergeList(pLinkList pList1,pLinkList pList2);  //合并两个链表
void SelectSort(pLinkList pList);           //直接插入法排序
void BubbleSort(pLinkList pList1);

#endif



MergeList.c


#include"mergelist.h"
void InitList(pLinkList pList)      //初始化链表
{
	assert(pList);
	pList->pHead=NULL;
}
void PrintList(pLinkList pList)     //打印链表
{
	pLinkNode cur=NULL;
	cur=pList->pHead;
	assert(pList);
	while(cur)
	{
		printf("%d->",cur->Data);
		cur=cur->next;
	}
	printf("over");
}
void Destroy(pLinkList pList)       //销毁链表
{
	pLinkNode cur=NULL;
	pLinkNode del=NULL;
	cur=pList->pHead;
	assert(pList);
	if(cur==NULL)
	{
		return;
	}
	while(cur)
	{
		del=cur;
		cur=cur->next;
		free(del);
		del=NULL;
	}
	pList->pHead=NULL;
}
void PushBack(pLinkList pList,DataType x)  //尾插
{
	pLinkNode cur=NULL;
	pLinkNode prev=NULL;
	pLinkNode newNode=(pLinkNode)malloc(sizeof(LinkNode));; 
	if(newNode==NULL)
	{
		printf("out of memory");
		exit(EXIT_FAILURE);
	}
	assert(pList);
	cur=pList->pHead;
	newNode->Data=x;
	newNode->next=NULL;
	while(cur==NULL)
	{
		pList->pHead=newNode;
		return;               //空链表尾插后就应该返回
	}
	while(cur)          //找最后一个结点
	{
		prev=cur;
		cur=cur->next;         
	}
	prev->next=newNode;
}
  
pLinkNode MergeList(pLinkList pList1,pLinkList pList2)  //合并两个链表
{
	pLinkNode cur=NULL;
	pLinkNode prev=NULL;
	assert((pList1)||(pList2));     
	if(pList1->pHead==NULL)        //如果链表1为空表
	{
		return pList2->pHead;
	}
	else if(pList2->pHead==NULL)    //如果链表2为空
	{
		return pList1->pHead;
	}
	else
	{
		cur=pList1->pHead;
		while(cur&&(cur->next))               //找链表1的最后结点
		{
			cur=cur->next;
		}
		cur->next = pList2 ->pHead ;     //链表1的尾与链表2的头相连  
	}
	return pList1->pHead;
}
void SelectSort(pLinkList pList)          //选择法排序
{
	pLinkNode i=NULL;
	pLinkNode j=NULL;
	pLinkNode cur=NULL;
	DataType tmp=0;
	cur=pList->pHead;
	assert(pList);
	for(i=cur;i!=NULL;i=i->next)
	{
		for(j=i->next;j!=NULL;j=j->next)
			if(i->Data>j->Data)
			{
				tmp=i->Data;
				i->Data=j->Data;
				j->Data=tmp;
			}
	}
}

void BubbleSort(pLinkList pList)              //对链表进行冒泡排序
{
	pLinkNode cur=pList->pHead;  
	pLinkNode tail=NULL;
    DataType flag=0;                           //表示有序
    DataType tmp=0;
	while(cur==NULL)
	{
		return;
	}
	while(cur->next==NULL)
	{
		return;
	}
    while(cur!=tail)  
    {  
        flag=0;  
        while(cur->next!=tail)  
        {  
            if(cur->Data > cur->next->Data)   //升序排列  
            {  
                tmp=cur->Data;  
                cur->Data=cur->next->Data;  
                cur->next->Data=tmp;  
                flag=1;  
            }  
            cur=cur->next; 
        }  
		tail=cur;
		cur=pList->pHead;
        if(flag == 0)  
            break;  
    }  
}



test.c
#include"mergelist.h"
void test()
{
	pLinkNode ret=NULL;
	LinkList List1;
	LinkList List2;
	InitList(&List1);
    InitList(&List2);
	PushBack(&List1,1);
    PushBack(&List1,5);
	PushBack(&List1,6);
	PushBack(&List1,4);
	PushBack(&List2,3);
	PushBack(&List2,7);
	PushBack(&List2,0);
	ret=MergeList(&List1,&List2);
	List1.pHead=ret;               //定义非指针变量时,在访问此对象成员时不用->
	/*SelectSort(&List1);*/
	BubbleSort(&List1);
	PrintList(&List1);
	Destroy(&List1);
}
int main()
{
	test();
	system("pause");
	return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值