合并两链表,在对两有序链表应该做较详尽的分析
1.一链表为空则合并结果为另一链表。
2.合并过程中的大小比较。(为减少开辟节点所占空间,可以比较两链表第一个节点元素大小,并将头节点直接赋给新节点)
3.两链表长度不同时的处理。
List.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;
}*pLinkList;
void Init_List(pLinkNode plist);
void Push_List(pLinkNode plist,DataType data);
void print_List(pLinkNode plist);
void free_List(pLinkNode plist);
pLinkNode Merge_List(pLinkNode plist1, pLinkNode plist2);
Merge.h
#include"List.h"
void Init_List(pLinkNode plist)
{
assert(plist);
plist->_next = NULL;
}
pLinkNode creatNode(DataType data)
{
pLinkNode newNode = (pLinkNode)malloc(sizeof(LinkNode));
if (newNode == NULL)
{
printf("out of memory");
exit(EXIT_FAILURE);
}
newNode->_data = data;
newNode->_next = NULL;
return newNode;
}
void Push_List(pLinkNode plist, DataType data)
{
pLinkNode newNode=creatNode(data);
if (NULL == plist->_next) //空链表
plist->_next = newNode;
else
while (plist->_next )
{
plist = plist->_next;
}
plist->_next = newNode;
}
void free_List(pLinkNode plist)
{
assert(plist);
if (NULL == plist->_next) //空链表
return;
else if (NULL == plist->_next->_next) //只有一个节点
{
free(plist->_next);
}
else
while (plist)
{
free(plist);
plist = plist->_next;
}
}
pLinkNode Merge_List(pLinkNode plist1, pLinkNode plist2)
{
assert(plist1);
assert(plist2);
pLinkNode plist3 = NULL;
pLinkNode cur = NULL;
if (NULL == plist1->_next)
return plist2;
if (NULL == plist2->_next)
return plist1;
if (plist1->_next->_data < plist2->_next->_data)
plist3 = plist1;
else
plist3 = plist2;
plist1 = plist1->_next;
plist2 = plist2->_next;
cur = plist3;
while (plist1 && plist2) //两链表进行比较
{
if (plist1->_data <= plist2->_data)
{
cur->_next = plist1;
plist1 = plist1->_next;
cur = cur->_next;
// plist3 = plist3->_next;
}
else if (plist1->_data > plist2->_data)
{
cur->_next = plist2;
plist2 = plist2->_next;
cur = cur->_next;
//plist3 = plist3->_next;
}
//某一链表已走完
//if (NULL!=plist1&&NULL!=plist2)
if (plist1 == NULL)
{
while (plist2)
{
cur->_next= plist2;
plist2 = plist2->_next;
cur = cur->_next;
// plist3 = plist3->_next;
}
}
if (plist2 == NULL)
{
while (plist1)
{
cur ->_next= plist1;
plist1 = plist1->_next;
cur = cur->_next;
// plist3 = plist3->_next;
}
}
}
return plist3;
}
void print_List(pLinkNode plist)
{
pLinkNode cur = plist;
while (cur)
{
printf("%d->", cur->_data);
cur = cur->_next;
}
printf("NULL\n");
}
test.c
#include"Merge.h"
void test()
{
LinkNode p1;
LinkNode p2;
pLinkNode p3 = NULL;
//LinkNode p1, p2;
Init_List(&p1);
Init_List(&p2);
Push_List(&p1, 1);
Push_List(&p1, 3);
Push_List(&p1, 5);
Push_List(&p1, 7);
print_List(&p1);
Push_List(&p2, 2);
Push_List(&p2, 4);
Push_List(&p2, 6);
Push_List(&p2, 8);
print_List(&p2);
p3=Merge_List(&p1,&p2);
print_List(p3);
}
int main()
{
test();
getchar();
return 0;
}