Skip to content
c

#define  nullE  ' '
#define  errV   ' '            
typedef char ElemType;

typedef struct NLNode {
    ElemType data;
    NLNode *next;
} *NLink, *Position;

typedef struct {
    NLink head, tail;
    int len;
} *NLinkList;

int equal(ElemType a, ElemType b);

int equal(ElemType a, ElemType b) {
    if(a == b) return TRUE;
    else return FALSE;
}

int Compare(ElemType a, ElemType b) {
    if(a < b) return -1;
    if(a > b) return 1;
    return 0;
}

int random2(int x, int y) {
    if(x >= y) return x;
    else return random(y - x) + x;
}

void get_purstr(char* str, int x) {
    int len, idx, kk;
    len = random(x);
    idx = random(10);
    kk = 0;
    while(kk < len && idx < 26) {
        str[kk] = 'A' + idx;
        idx = idx + random2(1, 4);
        kk++;
    }
    str[kk] = '\0';    
}

NLink MakeNode(ElemType e) {
    NLink p;
    if(!(p = (NLink)malloc(sizeof(NLNode)))) exit(OVERFLOW);
    p->data = e;
    p->next = NULL;
    return p;
}

NLink FreeList(NLinkList L) {
    if(!L || !L->head) return NULL;
    NLink q, p = L->head;
    while(p) {
        q = p;
        p = p->next;
        free(q);
    }
    free(L);
    return NULL;
}
 
NLink InitList() {
    NLinkList L;
    if(!(L = (NLinkList)malloc(sizeof(*L)))) exit(OVERFLOW);
    if(!(L->head = L->tail = (NLink)calloc(1, sizeof(*L->head)))) exit(OVERFLOW);
    L->len = 0;
    return L;
}

Status ClearNList(NLinkList L) {
    if(!L || !L->head) return ERROR;
    NLink q, p = L->head->next;
    L->tail = L->head;
    L->head->next = NULL; 
    L->len = 0;
    while(p) {
        q = p;
        p = p->next;
        free(q);
    }
    return OK;
}

Status ListEmpty(NLinkList L) {
    if(L->head == L->tail || !L->head || !L->tail) return 1;
    else return 0;
}

int ListLength(NLinkList L) {
   if (L) return L->len; 
   else return 0;
}

NLink GetHead(NLinkList L) {
   if (!L) return NULL;
   return L->head;
}

Position LocatePos(NLinkList L, int i) {
    if(!L||i<0) return NULL;
    NLink p = L->head; int j = 0;
    while(p && j < i) {
        p = p->next; ++j;
    }
    if(!p) return NULL;
    return p;
}


NLink PrevPos(NLinkList L, NLink p){
    NLink q;
    if(!L || !p) return NULL;
    for(q = L->head; q&&q->next!=p; q = q->next);
    return q;
}

NLink NextPos(NLinkList L, NLink p) {  
   if (!L || !p) return NULL;
   return p->next;
}

Status SetCurElem(NLink p, ElemType e) {
   if (p) { p->data = e;   return OK; }
   else return ERROR;
}

ElemType GetCurElem(NLink p) {
   if (p) return p->data;
   else return nullE;
}
Status AppendOne(NLinkList L, NLink s) { 
   if (!L || !s) return ERROR;
   L->tail->next = s;
   L->tail = s;   L->len++;   return OK;
}       
Status Append(NLinkList L, NLink s) { 
   if (!L || !s) return ERROR;
   L->tail->next = s;
   while (s->next) s = s->next;    
   L->tail = s;   L->len++;   return OK;
}

Status InsAfter(NLinkList L, NLink *p, NLink s) {  
   if (!L || !*p || !s) return ERROR;
   NLink q;  q = *p;
   s->next = q->next;   q->next= s;  
   if (L->tail == q) L->tail = s;    
   L->len++;   *p = s;                
   return OK;
}

NLink DelAfter(NLinkList L, NLink p) {  
   if (!L || !p) return NULL;
   NLink q = p->next;
   p->next = q->next;
   if (L->tail == q) L->tail = p;    
   L->len--;
   return q;
}


NLinkList CreateNLList(char* ss) { 
   NLinkList L;   int i;   NLink p;
   if (!(L = (NLinkList)malloc(sizeof(*L)))) exit(OVERFLOW);
   if (!(L->head = (NLink)calloc(1, sizeof(NLNode)))) exit(OVERFLOW);
   p = L->head;
   for (i=0; ss[i]; i++) {
      if (!(p->next = (NLink)malloc(sizeof(NLNode)))) exit(OVERFLOW);
      p = p->next;   p->data = ss[i];
   }
   L->tail = p;   p->next = NULL;   L->len  = i;
   return L;
}

Status ListInsert(NLinkList L, int i, ElemType e) {     
   Position p;
   if (!L || !L->head || i<1) return ERROR;       
   if (!(p = LocatePos(L, i-1))) return ERROR;    
   InsAfter(L, &p, MakeNode(e));                   
   return OK;
}

ElemType ListDelete(NLinkList L, int i) {   
   NLink p, s;   ElemType e;
   if (!L || !L->head || i<1) return nullE;         
   if (!(p = LocatePos(L, i-1))) return nullE;      
   if (p = DelAfter(L, p)) { e = p->data;   free(p);   return e; }  
   return errV;                                          
}

NLinkList MergeList(NLinkList La, NLinkList Lb, int (*compare)(ElemType, ElemType)) {        
   if (!La || !Lb) return NULL;               
   NLinkList Lc = InitList();                 
   NLink ha = GetHead(La), hb =GetHead(Lb);       
   NLink pa = NextPos(La,ha), pb=NextPos(Lb,hb);  
   while (pa && pb) {                            
      ElemType a = GetCurElem(pa), b = GetCurElem(pb);
      if (compare(a, b) <= 0)     
         { AppendOne(Lc, DelAfter(La, ha));   pa = NextPos(La, ha); }
      else                            
         { AppendOne(Lc, DelAfter(Lb, hb));   pb = NextPos(Lb, hb); }
   }//while
   if (pa) Append(Lc, pa);           
   else Append(Lc, pb);              
   free(ha);   free(hb);             
   free(La);   free(Lb);             
   return Lc;
}

void TravelNLList(NLinkList L, char* sa) { 
   int i ;   NLink p;
   p = L->head->next;   i = 0;   sa[0] = '(';
   while (p != NULL) {
      sa[++i] = p->data;
      p = p->next;
   }
   sa[++i] = ')';  sa[i+1] = '\0';
}

void printNLList(NLinkList L) {  
   NLink p = L->head->next;
   printf("(");   if (!p) { printf(")\n");   return; }
   printf("%c", p->data);   p=p->next;
   while (p!=NULL && p!=L) { printf(", %c", p->data);  p=p->next; }
   printf(")\n");
}

持之苟有恒,久久自芬芳