線性表順序表示及合并演算法

來源:互聯網
上載者:User

#define LIST_INIT_SIZE   100//線性表格儲存體空間的初始分配量#define LISTINCREMENT  10//線性表格儲存體空間的分配增量typedef struct{    ElemType *elem;//儲存空間基址    int length;    //當前長度    int listsize; //當前分配的儲存容量(以sizeof(ElemType)為單位)}SqList;Status InitList_Sq(SqList &L){   //構造一個線性表L    L.elem = (ElemType *) malloc (sizeof (ElemType) *  LIST_INIT_SIZE );    if(! L.elem) exit(OVERFLOW);//儲存分配失敗    L.length = 0;    L.listsize = LIST_INIT_SIZE;    //容量    return OK;}//插入演算法//一般情況下,在第i(1<= i <=n)個元素之前插入一個元素時,需將第n至第i個(共 n-i+1)元素向後移動一個位置Status ListInsert_Sq(SqList & L, int i, ElemType e){    //在順序線性表L中第i個位置之前插入新的元素e    //i的合法值為 1<= i <=ListLength_Sq(L) +1    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.listsize += LISTINCREMENT;//增加儲存容量    }    q = &(L.elem[i-1]);//q為插入位置    for( p = &(L.elem[L.length - 1]) ; p>=q; --p)    *(p+1) = *p;    *q = e;     //插入e    ++L.length;    //表長增1    return OK;}//刪除演算法//一般情況下,刪除第i(1<= i <= n)個元素時需要將從第 i+1 至第n(共 n-i)個元素一次向前移動一個位置Sataus ListDelete_Sq(SqList & L,int i , ElemType &e){        //在順序線性表L中刪除第i個元素,並用e返回其值        //i的合法值為 1<= i <=ListLength_Sq(L)         if(i<1 || i>L.length + 1) return ERROR;        p=&(L.elem[i-1]);        //p為被刪除的元素的位置        e=*p;        //被刪除的元素值賦給e        q=L.elem + L.length -1;        //表尾元素的位置        for(++p; p <= q; ++p)     *(p-1) = *p;        --L.length;        return OK;}//兩個有序線性表的合并//演算法時間複雜度 O(ListLength(LA)+ListLength(LB))void MergeList(List La,List Lb, List &Lc){//La和Lb中資料元素按值非遞減排列,歸併後的資料元素也按非遞減排列InitList(Lc);i=j=1;k=0;La_len = Listlength(La); Lb_len = Listlength(Lb);while(( i <= La_len) && (j <= Lb_len)){        GetElem(La,i,ai); GetElem(Lb, j, bj);        if(ai <= bj){ ListInsert(Lc, ++k, ai); ++i;}        else {ListInsert(Lc, ++k, bj); ++j;}    }while(i <= La_len){    GetElem(La, i++, ai); ListInsert(Lc, ++k, ai);    }while(j <= Lb_len){    GetElem(Lb,j++,bj);  ListInsert(Lc, ++k, bj);    }}//合并演算法,指標表示void MergeList_Sq(SqList La, SqList Lb, SqList &Lc){    pa = La.elem;    pb=Lb.elem;    Lc.listsize = Lc.length = La.Length + Lb.length;            //初始化Lc    pc = Lc.elem = (ElemType *) malloc (sizeof(ElemType) * Lc.listsize);    if(! Lc.elem) exit(OVERFLOW);    pa_last = pa + La.length - 1;    pb_last = pb + Lb.length - 1;    while(pa <= pa_last && pb <= pb_last){        if(*pa <= *pb)  *(pc++) = *(pa++);        else    *(pc++) = *(pb++);    }    while(*pa <= pa_last)    *(pc++) = *(pa++);    while(*pb <= pb_lasst)    *(pc++) = *(pb++);}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.