链表的合并,用三种方法实现: ListUnion对应算法2.1 MergeList对应算法2.2 MergeList对应算法2.7 /* * Copyright (c) leo * All rights reserved. * filename: listOperate.h * summary : 线性表的高级操作-合并 头文件 * version : 1.0 * author : leo * date : 6.10.2011 */ #include "dsList.h" typedef SqList List; /*线性表的合并:将在lb中但不在la中的数据元素插入到a中 *此算法复杂度为O(ListLength(la) * ListLength(lb)) */ void ListUnion(List &la, List &lb); /*线性表的合并:la、lb非递减有序,将其合并到lc中,仍非递减有序 *此算法复杂度为O(ListLength(la) + ListLength(lb)) *利用了链表的基本操作,插入法 */ void MergeList(List la, List lb, List &lc); /*线性表的合并:la、lb非递减有序,将其合并到lc中,仍非递减有序 *此算法复杂度为O(ListLength(la) + ListLength(lb)) *利用了指针,赋值法 */ void MergeList_p(List la, List lb, List &lc); /* * Copyright (c) leo * All rights reserved. * filename: listOperate.cpp * summary : 线性表的高级操作-合并 实现 * version : 1.0 * author : leo * date : 6.10.2011 */ #include <iostream> #include "listOperate.h" /*线性表的合并:将在lb中但不在la中的数据元素插入到a中 *此算法复杂度为O(ListLength(la) * ListLength(lb)) */ void ListUnion(List &la, List &lb) { int lena = ListLength(la); int lenb = ListLength(lb); for(int i=1; i<=lenb; i++) { ElemType e; GetElem(lb, i, e); if(-1 == LocateElem(la, e))//e不在la中则插入到la ListInsert(la, ++lena, e); } } /*线性表的合并:la、lb非递减有序,将其合并到lc中,仍非递减有序 *此算法复杂度为O(ListLength(la) + ListLength(lb)) *利用了链表的基本操作,插入法 */ void MergeList(List la, List lb, List &lc) { InitList(lc); int lena = ListLength(la), lenb = ListLength(lb); int i = 0, j = 0, k = 0; while(i<lena && j<lenb) //la、lb均非空 { ElemType ai; GetElem(la, i+1, ai); ElemType bj; GetElem(lb, j+1, bj); if(ai <= bj) //取较小者插入 { ListInsert(lc, ++k, ai); if(ai == bj) //这两句是为了去重 j++; // i++; } else { ListInsert(lc, ++k, bj); j++; } } while(i < lena) //la尚有数据元素未插入 { ListInsert(lc, ++k, la.elem[i]); i++; } while(j < lenb) { ListInsert(lc, ++k, lb.elem[j]); j++; } } /*线性表的合并:la、lb非递减有序,将其合并到lc中,仍非递减有序 *此算法复杂度为O(ListLength(la) + ListLength(lb)) *利用了指针,赋值法 */ void MergeList_p(List la, List lb, List &lc) { ElemType *pa = la.elem, *pb = lb.elem; lc.listsize = lc.length = la.length + lb.length; //不去重 ElemType *pc = lc.elem = (ElemType *)malloc(lc.listsize * sizeof(ElemType)); if(!lc.elem) exit(OVERFLOW); ElemType *paLast = la.elem + la.length - 1, *pbLast = lb.elem + lb.length - 1; while(pa <= paLast && pb <= pbLast) { if(*pa <= *pb) { //if(*pa == *pb) //不去重 // pb++; *pc++ = *pa++; } else *pc++ = *pb++; } while(pa <= paLast) *pc++ = *pa++; while(pb <= pbLast) *pc++ = *pb++; } /* * Copyright (c) leo * All rights reserved. * filename: app.cpp * summary : 线性表的高级操作-合并 应用 * version : 1.0 * author : leo * date : 6.10.2011 */ #include <iostream> #include "listOperate.h" using namespace std; int main() { //--------------------------------------------------- SqList alist; InitList(alist); ListInsert(alist, 1, 5); ListInsert(alist, 2, 8); ListInsert(alist, 3, 11); cout<<"----------alist-----------"<<endl; cout<<ListLength(alist)<<" "<<alist.listsize<<endl; cout<<"-------------------------"<<endl; for(int n=0; n<alist.length; n++) cout<<alist.elem[n]<<endl; //--------------------------------------------------- SqList listb; InitList(listb); ListInsert(listb, 1, 6); ListInsert(listb, 2, 8); ListInsert(listb, 3, 9); ListInsert(listb, 4, 11); ListInsert(listb, 5, 15); ListInsert(listb, 6, 20); cout<<"----------listb-----------"<<endl; cout<<ListLength(listb)<<" "<<listb.listsize<<endl; cout<<"-------------------------"<<endl; for(int i=0; i<listb.length; i++) cout<<listb.elem[i]<<endl; //--------------------------------------------------- List listc; MergeList(alist, listb, listc); cout<<"----------listc after merge-----------"<<endl; cout<<ListLength(listc)<<" "<<listc.listsize<<endl; cout<<"-------------------------"<<endl; for(int j=0; j<listc.length; j++) cout<<listc.elem[j]<<endl; cout<<"-------------------------"<<endl; //--------------------------------------------------- List listd; MergeList_p(alist, listb, listd); cout<<"----------listd after merge_p-----------"<<endl; cout<<ListLength(listd)<<" "<<listd.listsize<<endl; cout<<"-------------------------"<<endl; for(int jj=0; jj<listd.length; jj++) cout<<listd.elem[jj]<<endl; cout<<"-------------------------"<<endl; //--------------------------------------------------- ListUnion(alist, listb); cout<<"----------alist after union-----------"<<endl; cout<<ListLength(alist)<<" "<<alist.listsize<<endl; cout<<"-------------------------"<<endl; for(int k=0; k<alist.length; k++) cout<<alist.elem[k]<<endl; cout<<"-------------------------"<<endl; return 0; }