合并两链表

来源:互联网 发布:淘宝加入购物车看不到 编辑:程序博客网 时间:2024/03/29 22:38

合并两链表,在对两有序链表应该做较详尽的分析

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;elsewhile (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);}elsewhile (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;elseplist3 = 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;}


原创粉丝点击