1. 程式人生 > >用C語言實現線性表歸併_含原始碼和執行結果_資料結構(C語言版)

用C語言實現線性表歸併_含原始碼和執行結果_資料結構(C語言版)

  • 採用動態分配順序儲存結構實現
  • 採用單鏈表結構實現

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;
}

執行結果: