Skip to content
c
#define  TRUE   1
#define  FALSE  0
#define  OK     1
#define  ERROR  0
#define  INFEASIBLE  -1
#define  OVERFLOW    -2  
#define  errInt   -999
#define  errE     -999
#define  nullE    -999
typedef  int  Status;       
typedef  int  ElemType;      

typedef struct {
    ElemType * elem;
    int len;
    int size;
    int inc;    
} * SqList, *List;            

SqList InitList(int size, int inc) {
    SqList L;
    if(!(L = (SqList)malloc(sizeof(*L)))) exit(OVERFLOW);
    L->elem = (ElemType*)malloc(size*sizeof(ElemType));
    
    if(!L->elem) exit(OVERFLOW);
    L->len = 0;
    L->size = size;
    L->inc = inc;
    
    return L;    
}
SqList CreateList(ElemType es[], int n) {
    SqList L;
    if(!(L = (SqList)malloc(sizeof(*L)))) exit(OVERFLOW);
    if(!(L->elem = (ElemType*)malloc(n+5*sizeof(ElemType)))) exit(OVERFLOW);
    for(int i = 0; i < n; i++) L->elem[i] = es[i];
    L->size = n + 5; L->len = n; L->inc = 5;
    return L;
}


SqList FreeList(SqList L){
    if(L) {
        free(L->elem);
        free(L);
    }
    return NULL;
}

int ListLen(SqList L) {
    if(L) return L->len;
    else return errInt;
}

ElemType GetElem(SqList L, int i) {
    if(!L||i<1||i>L->len) return errE;
    return L->elem[i-1];
}

Status ListInsert(SqList L, int i, ElemType e) {
     if(!L||i<1||i>L->len+1) return ERROR;
     if(L->len >= L->size) {
        L->elem = (ElemType*)realloc(L->elem, (L->size+L->inc)*sizeof(ElemType));
        if(!L->elem) exit(OVERFLOW);
        L->size+=L->inc;
     }
     memmove(L->elem+i, L->elem+i-1, (L->len-i+1)*sizeof(ElemType));
     L->elem[i-1]=e; L->len++;
     return OK;
}

ElemType ListDelete(SqList L, int i) {
   if(!L||i<1||i>L->len) return errE;
   ElemType *p = &(L->elem[i-1]);
   ElemType e = *p;
   memmove(p, p+1, (L->len-i)*sizeof(ElemType));
   --L->len;
   return e;
}

int equal(ElemType a, ElemType b) {
    if(a==b) return TRUE;
    else return FALSE;
}
   
int LocateElem(SqList L, ElemType e, Status(*equal)(ElemType, ElemType)) {
    int i = 1;
    ElemType *p = L->elem;
    while(i <= L->len && !(*equal)(*p++, e)) ++i;
    if(i <= L->len) return i;
    else return 0;
}

int LocateElem_Sq(SqList L, ElemType e, Status(*equal)(ElemType, ElemType)) {
    if(!L) return 0;
    int i = 1;
    ElemType *p = L->elem; 
    while(i<=L->len && !equal(*p++, e)) ++i;
    if(i<=L->len) return i;
    else return 0;    
}


void Union(SqList La, SqList Lb) {
    int m = ListLen(La);
    int n = ListLen(Lb);
    for(int i = 1; i <= n; i++) {
        ElemType e = GetElem(Lb, i);
        if(0 == LocateElem(La, e, equal)) {
           ListInsert(La, ++m, e);
        }
    }
}

SqList MergeList_Sq(SqList La, SqList Lb) {
    SqList Lc;
    ElemType *pa, *pc, *pb, *pa_end, *pb_end; 
    if(!La || !Lb) return NULL;
    pa = La->elem; pb = Lb->elem;
    Lc = InitList(La->len + Lb->len, La->inc);
    Lc->len = Lc->size;
    pc = Lc->elem;
    pa_end = La->elem + La->len-1;
    pb_end = Lb->elem + Lb->len-1;
    while(pa<=pa_end && pb<=pb_end) {
        if(*pa<=*pb) *pc++=*pa++;
        else *pc++=*pb++;
    }
    if(pa<=pa_end) memcpy(pc, pa, (pa_end-pa+1)*sizeof(ElemType));
    if(pb<=pb_end) memcpy(pc, pb, (pb_end-pb+1)*sizeof(ElemType));
    
    return Lc;
}

持之苟有恒,久久自芬芳