用C語言實現線性表歸併_含原始碼和執行結果_資料結構(C語言版)
阿新 • • 發佈:2018-12-16
- 採用動態分配順序儲存結構實現
- 採用單鏈表結構實現
1.採用動態分配實現
#include<stdio.h> #include<stdlib.h> #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 #define OVERFLOW 0 #define ERROR 0 typedef int ElemType; //設定了一個結構體,並且將其自定義為SqList typedef struct { ElemType * elem;//存放線性表元素 int length; int listsize; }SqList; //初始化一個線性表 void InitList(SqList *L) { L->elem=(ElemType * )malloc(LIST_INIT_SIZE * sizeof(ElemType)); if(!L->elem)exit(OVERFLOW); L->length =0; L->listsize=LIST_INIT_SIZE; } //線上性表L的i位置插入新元素e void ListInsert_Sq(SqList *L,int i,ElemType e) { ElemType * newbase, * q, * p; if(i<1||i>L->length+1)return ERROR; if(L->length>=L->listsize) { newbase=(ElemType * )realloc(L->elem,(L->listsize+LISTINCREMENT) * sizeof(ElemType)); if(!newbase)exit(OVERFLOW); L->elem=newbase; L->listsize=L->listsize+LISTINCREMENT; } q=&(L->elem[i-1]); for(p=&(L->elem[L->length-1]);p>=q;--p)* (p+1)= * p; * q= e; ++L->length; } //通過遍歷線性表實現對線性表元素的列印 void ListTraverse_Sq(SqList L) { ElemType * p; int i; p=L.elem; for(i=1;i<=L.length;i++) { if(i!=1)printf(" %d", * p++); else+ printf("%d", * p++); } printf("\n"); } //返回線性表的長度 int ListLength_Sq(SqList L) { return L.length; } //獲得線性表L的i位置處的元素,並且將其賦值給e void GetElem(SqList L,int i,ElemType *e) { if(i<1||i>L.length)exit(ERROR); *e= * (L.elem+i-1); } //處理兩個線性表,並且將其合併成一個新的線性表,將其賦值給Lc void MergeList(SqList La,SqList Lb,SqList *Lc) { int i=1,j=1,k=0; int La_length,Lb_length; ElemType ai, bj; InitList(Lc); La_length=ListLength_Sq(La); Lb_length=ListLength_Sq(Lb); while((i<=La_length) && (j<=Lb_length)) { GetElem(La,i,&ai); GetElem(Lb,j,&bj); if(ai<=bj) { ListInsert_Sq(Lc,++k,ai); ++i; } else { ListInsert_Sq(Lc,++k,bj); ++j; } } while(i<=La_length) { GetElem(La,i++,&ai); ListInsert_Sq(Lc,++k,ai); } while(j<=Lb_length) { GetElem(Lb,j++,&bj); ListInsert_Sq(Lc,++k,bj); } } int main() { int m,n,j; printf("請輸入第一個線性表的元素個數:"); scanf("%d",&m); int a[m]; printf("請依次輸入第一個線性表的元素(輸入一個按一下回車再輸下一個),按照線性輸入(升序):\n"); for(j=0;j<m;j++){ scanf("%d",&a[j]); } printf("請輸入第二個線性表的元素個數:"); scanf("%d",&n); int b[n]; printf("請依次輸入第一個線性表的元素(輸入一個按一下回車再輸下一個),按照線性輸入(升序):\n"); for(j=0;j<n;j++){ scanf("%d",&b[j]); } SqList La,Lb,Lc; InitList(&La); for(j=1;j<=m;j++)ListInsert_Sq(&La,j,a[j-1]); printf("第一個線性表為:"); ListTraverse_Sq(La); InitList(&Lb); for(j=1;j<=n;j++) ListInsert_Sq(&Lb,j,b[j-1]); printf("第二個線性表為:"); ListTraverse_Sq(Lb); MergeList(La,Lb,&Lc); printf("線性合成之後所得新連結串列的元素為:\n"); ListTraverse_Sq(Lc); return 0; }
執行結果:
2.採用單鏈表實現
#include<stdio.h> #include<stdlib.h> typedef struct { int *elem; struct SqList *next; }SqList; SqList* InitList(int m); void ListTraverse_Sq(SqList* head); SqList* MergeList(SqList *head_La,SqList *head_Lb); SqList* InitList(int m) { int i; SqList *head,*pa,*qa; head=(SqList *)malloc(sizeof(SqList)); head->next=NULL; qa=head; for(i=1;i<=m;i++){ pa=(SqList *)malloc(sizeof(SqList)); printf("請輸入線性表第%d個數的值:",i); scanf("%d",&pa->elem); qa->next=pa; qa=qa->next; } qa->next=NULL; return head;//返回頭結點 } void ListTraverse_Sq(SqList* head) { SqList *pa; int i; pa=head->next; while(pa) { printf("%d ",pa->elem); pa=pa->next; } } SqList* MergeList(SqList *head_La,SqList *head_Lb) { SqList *head_Lc,*qa,*qb,*wire_Lc; qa=head_La->next; qb=head_Lb->next; wire_Lc=head_Lc; while(qa&&qb) { if(qa->elem<=qb->elem) { wire_Lc->next=qa; wire_Lc=wire_Lc->next; qa=qa->next; } else { wire_Lc->next=qb; wire_Lc=wire_Lc->next; qb=qb->next; } } if(qa==NULL){//qa連結串列走到頭 wire_Lc->next=qb;//qb連上 }else{ wire_Lc->next=qa; } return head_Lc;//返回連線新連結串列 } int main() { SqList *La,*Lb,*Lc; int m; printf("請輸入第一個線性表所含數字個數:"); scanf("%d",&m); La=InitList(m); printf("La={"); ListTraverse_Sq(La); printf("}\n"); printf("請輸入第二個線性表所含數字個數:"); scanf("%d",&m); Lb=InitList(m); printf("Lb={"); ListTraverse_Sq(Lb); printf("}\n"); Lc=MergeList(La,Lb); printf("合併後的線性表為:Lc={"); ListTraverse_Sq(Lc); printf("}\n"); return 0; }
執行結果: