1. 程式人生 > >c語言資料結構之順序線性表的合併、並集

c語言資料結構之順序線性表的合併、並集

//#include "list_test.c"
//#include "link_list_test.c"
#include "List.h"
#include "LinkList.h"
#include "utils.c"
void MergeList(const List * l1,const List * l2,List * l3);
void list_union(List * l1,List * l2,List * l3);
void print(int data);
int main() {

//    list_test();
//    link_list_test();
List l1,
l2,l3; InitList(&l1); InitList(&l2); InitList(&l3); insert(&l1,3); insert(&l1,5); insert(&l1,8); insert(&l1,11); ListTraverse(&l1,print); printf("\n"); insert(&l2,2); insert(&l2,6); insert(&l2,8); insert(&l2,9); insert(&l2,11); insert(&l2,15);
insert(&l2,20); ListTraverse(&l2,print); printf("\n"); MergeList(&l1,&l2,&l3); ListTraverse(&l3,print); printf("\n"); DestroyList(&l3); InitList(&l3); list_union(&l1,&l2,&l3); ListTraverse(&l3,print); printf("\n"); return 0; } void print(int data) { printf("
%d ",data); } /** * l1l2合併為l3 * @param l1 * @param l2 * @param l3 */ void MergeList(const List * l1,const List * l2,List * l3) { int i=0,j=0; int data1,data2; while(i<l1->length && j<l2->length) { data1 = *GetElem(l1, i); data2 = *GetElem(l2,j); if(data1 <= data2) { insert(l3,data1); insert(l3,data2); }else{ insert(l3,data2); insert(l3,data1); } i++,j++; } while(i<l1->length) { insert(l3,*GetElem(l1,i)); i++; } while(j<l2->length) { insert(l3,*GetElem(l2,j)); j++; } } //並集操作 void list_union(List * l1,List * l2,List * l3) { int i=0,j=0,n=0; int data1,data2; while(i<l1->length && j<l2->length) { data1 = *GetElem(l1, i); data2 = *GetElem(l2,j); if(data1 < data2) { insert(l3,data1); insert(l3,data2); n+=2; }else if(data1 == data2){ insert(l3,data1); n++; } else{ insert(l3,data2); insert(l3,data1); n+=2; } i++,j++; } while(i<l1->length) { if(*GetElem(l3,n-1) == *GetElem(l1,i)) { i++; continue; } insert(l3,*GetElem(l1,i)); n++; i++; } while(j<l2->length) { if(*GetElem(l3,n-1) == *GetElem(l2,j)) { j++; continue; } insert(l3,*GetElem(l2,j)); n++; j++; } }

執行結果: