合并两个链表,顾名思义至少得有两个链表,比如说:链表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;
}