合并有序的两个线性表
合并,链式表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; }