合併兩個有序表
阿新 • • 發佈:2019-02-02
題目:兩串數字有序,分別用順序表和連結串列的方式,將兩串數字合併。
一、順序表
思路:
如有有序表A,B: A:1 2 4 5 5 B:2 3 3 6 7
1.一開始 i 指向 A的開頭元素(即1),同理 j 指向 B開頭元素(2)
2.A[i] 和 B[j] 中對比,選較小的放入新表C中
二、連結串列#include<stdio.h> #include<stdlib.h> #define LIST_INIT_SIZE 30 struct Sqlist { int *elem; int length; int listsize; }; void InitSqlist(struct Sqlist *L) { L->elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int)); if(!L->elem) exit(1); L->length=0; L->listsize=LIST_INIT_SIZE; } void read(struct Sqlist *L) { int n=0,i=0; int *newbase; printf("輸入順序表含元素個數"); scanf("%d",&n); if(n>L->listsize) { newbase=(int *)realloc(L->elem,(n)*sizeof(int)); L->elem=newbase; L->listsize=n; } printf("\n"); printf("輸入元素"); while(i<n) { scanf("%d",&L->elem[i++]); L->length=i; } } void pri(struct Sqlist *L) { int i=0; for(i=0;i<L->length;i++) { printf(" %d",L->elem[i]); } } void main() { int n,s; int i=0,j=0,k=0; struct Sqlist L,Q,S; void InitSqlist(struct Sqlist *L); void read(struct Sqlist *L); void pri(struct Sqlist *L); InitSqlist(&L); read(&L); pri(&L); printf("\n"); InitSqlist(&Q); read(&Q); pri(&Q); printf("\n"); InitSqlist(&S); while(i<L.length&&j<Q.length)//s有超出空間的可能,可以通過初始化加以改變 { if(L.elem[i]<Q.elem[j]) { S.elem[k]=L.elem[i]; k++;i++; } else { S.elem[k]=Q.elem[j]; k++;j++; } } while(i<L.length) { S.elem[k]=L.elem[i++]; k++; } while(j<Q.length) { S.elem[k]=Q.elem[j++]; k++; } S.length=k; pri(&S); }
#include<stdio.h> #include<stdlib.h> typedef struct Node { int elem; struct Node *next; }node; node *write() { int i,n; node *head,*p; printf("輸入連結串列長度:"); scanf("%d",&n); printf("輸入元素:"); head=(node *)malloc(sizeof(node)); /*p=(node *)malloc(sizeof(node));//這樣寫每次建立連結串列後,都會多出 head->next=p; //一個空間,對迴圈的判斷也有影響 p->next=NULL; for(i=0;i<n;i++) { scanf("%d",&p->elem); p->next=(node *)malloc(sizeof(node)); p=p->next; p->next=NULL; }*/ /*p=(node *)malloc(sizeof(node)); head->next=p; for(i=0;i<n;i++) { scanf("%d",&p->elem); if(i<=n-2)//最後一個不需要再次開闢空間,但是每次都需要判斷 { //能否在保證與頭連結串列連線的同時,不需要每次判斷 ,當然能 p->next=(node *)malloc(sizeof(node)); p=p->next; } } p->next=NULL;//這步很重要 */ p=(node *)malloc(sizeof(node)); head->next=p; for(i=1;i<n;i++)//注意i是從1開始的,這樣可以減少一次迴圈,從而減少一次空間的建立,但也少輸入一個數, { //要事後補救 scanf("%d",&p->elem); p->next=(node *)malloc(sizeof(node)); p=p->next; } scanf("%d",&p->elem); p->next=NULL; return head; } node *mergelist(node *la,node *lb) { node *lc; node *pa,*pb,*pc; lc=la; pa=la->next;pb=lb->next; pc=lc; while(pa&&pb) { if(pa->elem<pb->elem) { pc->next=pa; pc=pc->next; pa=pa->next; } else { pc->next=pb; pc=pc->next; pb=pb->next; } } pc->next=pa?pa:pb; return lc; } void main() { node *la,*lb,*lc,*pc; node *write(); node *mergelist(node *la,node *lb); la=write(); lb=write(); lc=mergelist(la,lb); pc=lc->next; while(pc) { printf("%d ",pc->elem); pc=pc->next; } }