合并有序的两个线性表
合并,链式表2016-06-06
pLinkNode merge_list(pLinkNode plist1,pLinkNode plist2)
{
pLinkNode plist3=NULL;
pLinkNode cur=NULL;
assert(plist1);
assert(plist2);
if(NULL == plist1->next) //传进来的有一个是空链表
{
return plist2;
}
else if(NULL == plist2->next)
{
return plist1;
}
if(plist1->next->data <= plist2->next->data) //使得plist3和开始数据最小的链表公用同一个头指针
{
plist3=plist1;
}
else
{
plist3=plist2;
}
plist1=plist1->next;
plist2=plist2->next;
cur=plist3;
while(plist1 != NULL && plist2 != NULL) //plist3依然是按照递增的顺序排列
{
if(plist1->data <= plist2->data)
{
cur->next=plist1;
cur=plist1;
plist1=plist1->next;
}
else
{
cur->next=plist2;
cur=plist2;
plist2=plist2->next;
}
}
while(plist1 != NULL) //链表中比较完成后依然有未比较完的数据,只执行其中的一个while循环
{
cur->next=plist1;
plist1=plist1->next;
}
while(plist2 != NULL)
{
cur->next=plist2;
plist2=plist2->next;
}
return plist3;
}#include"mergelist.h"
void text1()
{
pLinkNode ret=NULL;
LinkNode plist1;
LinkNode plist2;
Init_list(&plist1);
Init_list(&plist2);
printf("链表1的元素为:");
Pust_list(&plist1,3);
Pust_list(&plist1,5);
Pust_list(&plist1,8);
Pust_list(&plist1,11);
Print_list(&plist1);
printf("链表2的元素为:");
Pust_list(&plist2,2);
Pust_list(&plist2,8);
Pust_list(&plist2,9);
Pust_list(&plist2,15);
Print_list(&plist2);
printf("合并之后链表的元素为:");
ret=merge_list(&plist1,&plist2);
Print_list(ret);
Free_list(ret);
}
int main()
{
text1();
system("pause");
return 0;
}#ifndef __MERGELIST_H__
#define __MERGELIST_H__
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int DateType;
typedef struct LinkNode
{
DateType data;
struct LinkNode *next;
}LinkNode,*pLinkNode;
void Init_list(pLinkNode plist);
void Pust_list(pLinkNode plist,DateType x); //尾插
pLinkNode merge_list(pLinkNode plist1,pLinkNode plist2); //合并两个有序链表
void Print_list(pLinkNode plist);
void Free_list(pLinkNode plist);
#endif //__MERGELIST_H__#include"mergelist.h"
void Init_list(pLinkNode plist)
{
assert(plist);
plist->next=NULL;
}
pLinkNode Create_Node(DateType x)
{
pLinkNode newNode=(pLinkNode)malloc(sizeof(LinkNode));
if(NULL == newNode)
{
printf("out of memory\n");
exit(EXIT_FAILURE);
}
newNode->data=x;
newNode->next=NULL;
return newNode;
}
void Pust_list(pLinkNode plist,DateType x)
{
pLinkNode cur=plist->next;
pLinkNode newNode=NULL;
assert(plist);
newNode=Create_Node(x);
if(NULL == plist->next) //空链表时
{
plist->next=newNode;
}
else
{
while(cur->next != NULL)
{
cur=cur->next;
}
cur->next=newNode;
}
}
pLinkNode merge_list(pLinkNode plist1,pLinkNode plist2)
{
pLinkNode plist3=NULL;
pLinkNode cur=NULL;
assert(plist1);
assert(plist2);
if(NULL == plist1->next) //传进来的有一个是空链表
{
return plist2;
}
else if(NULL == plist2->next)
{
return plist1;
}
if(plist1->next->data <= plist2->next->data) //使得plist3和开始数据最小的链表公用同一个头指针
{
plist3=plist1;
}
else
{
plist3=plist2;
}
plist1=plist1->next;
plist2=plist2->next;
cur=plist3;
while(plist1 != NULL && plist2 != NULL) //plist3依然是按照递增的顺序排列
{
if(plist1->data <= plist2->data)
{
cur->next=plist1;
cur=plist1;
plist1=plist1->next;
}
else
{
cur->next=plist2;
cur=plist2;
plist2=plist2->next;
}
}
while(plist1 != NULL) //链表中比较完成后依然有未比较完的数据,只执行其中的一个while循环
{
cur->next=plist1;
plist1=plist1->next;
}
while(plist2 != NULL)
{
cur->next=plist2;
plist2=plist2->next;
}
return plist3;
}
void Print_list(pLinkNode plist)
{
pLinkNode cur=plist->next;
assert(plist);
while(cur != NULL)
{
printf("%d->",cur->data);
cur=cur->next;
}
printf("over\n");
}
void Free_list(pLinkNode plist)
{
pLinkNode cur=plist->next;
pLinkNode tmp=NULL;
if(NULL == plist->next) //空链表
{
return ;
}
else if(NULL == plist->next->next) //只有一个结点
{
free(plist->next);
plist->next=NULL;
}
else
{
while(cur != NULL)
{
tmp=cur;
cur=cur->next;
free(tmp);
tmp=NULL;
}
}
plist=NULL;
}