合併兩個順序儲存結構的線性表...
阿新 • • 發佈:2019-02-07
大二,開始上資料結構(吳蔚敏那版的)了,上課老師照著書上,感覺沒什麼用,光講演算法,也沒說具體演算法是怎麼實現的,就不聽.十一分出兩天來看看書,才發現真的還是挺難的.老師說的都是精髓,至於演算法就應該自己去安照精髓去摸索,語言學習不就是這樣麼,最後學的都是方法吧.恩,好好聽課,天天向上.
演算法:想讓lb中的元素,插入到la中,首先我們得想步驟是怎麼樣的?
1.給la,lb插入原始的元素
2.查詢lb中的元素
3.和la中的比較,看是否重複,不重複,就插入,重複就不插入(好邪惡!)
4.輸出la即可.
可以把大體思路,走一下,哪一步用到哪些函式,然後分別把各個函式實現,最後在主函式中呼叫,一氣呵成.把一個大的程式分成幾個小的部分,分別寫完測試成功,再拼接在一起.額,很難把我想的表達出來.看程式碼吧....
程式碼:
有什麼不明白的可以給我留言哦...(毫無存在感啊!!!o(╯□╰)o)#include<iostream> #include <malloc.h> #define LIST_INIT_SIZE 100 #define LISTINCREAMENT 10 #define OVERFLOW -2 #define OK 1 using namespace std; typedef struct { int *elem; int length; int listsize; }sqlist; //初始化連結串列 int InitList_Sq(sqlist &L) { L.elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int)); if(!L.elem) exit(OVERFLOW); L.length=0; L.listsize=LIST_INIT_SIZE; return OK; } //給連結串列增加元素 int listInsert(sqlist &L,int i,int e) { int *newbase,*q,*p; if (i<1||i>L.length+1) return OVERFLOW; if(L.length>=L.listsize) { newbase=(int*)realloc(L.elem,(L.listsize+LISTINCREAMENT)*sizeof(int)); if(!newbase) exit(OVERFLOW); L.elem=newbase; L.listsize+=LISTINCREAMENT; } q=L.elem+i-1; for(p=L.elem+L.length-1;p>=q;--p) *(p+1)=*p; *q=e; ++L.length; return OK; } //確定連結串列元素在連結串列中的位置. int locateList(sqlist L,int e ) { int *p,i=1; p=L.elem; while(i<=L.length&&e!=*p) { ++i;++p; } if(i<=L.length) return i; else return 0; } //合併兩個連結串列 int unionmerge(sqlist&la,sqlist &lb) { int i,e; for(i=1;i<=lb.length;i++) { e=*(lb.elem+i-1); if(!locateList(la,e)) listInsert(la,la.length+1,e); } return OK; } void main() { //1.給la,lb插入元素 int n,e; sqlist la;InitList_Sq(la); cout<<"請輸入第一個集合la中的元素個數:"; cin>>n; cout<<"請輸入第一個集合la中的各個元素:"; for(int i=1;i<=n;++i) { cin>>e; listInsert(la,i,e); } int m;sqlist lb;InitList_Sq(lb); cout<<"請輸入第二個集合lb中的元素個數:"; cin>>m; cout<<"請輸入第二個集合lb中的各個元素:"; for(int i=1;i<=m;++i) { cin>>e; listInsert(lb,i,e); } //2和3,合併la,lb,也就是將lb的元素插入到la. unionmerge(la,lb); //輸出合併的函式 cout<<"合併後的線性表是:"<<endl; for(int i=1;i<=la.length;i++) { cout<<*(la.elem+i-1)<<" "; } cout<<endl; }