厳蔚敏版データ構造教科書コード——チェーンテーブル構造実現アルゴリズム2.2(BUCT-JK 1602-LLP)


 /* algo2-13.c           2.2   ,  4  algo2-2.c   */
 //#include"c1.h"
  /* c1.h (   ) */
 #include<string.h>
 #include<ctype.h>
 #include<malloc.h> /* malloc()  */
 #include<limits.h> /* INT_MAX  */
 #include<stdio.h> /* EOF(=^Z F6),NULL */
 #include<stdlib.h> /* atoi() */
 #include<io.h> /* eof() */
 #include<math.h> /* floor(),ceil(),abs() */
 #include<process.h> /* exit() */
 /*          */
 #define TRUE 1
 #define FALSE 0
 #define OK 1
 #define ERROR 0
 #define INFEASIBLE -1
 /* #define OVERFLOW -2    math.h    OVERFLOW   3,      */
 typedef int Status; /* Status      ,           , OK  */
 typedef int Boolean; /* Boolean     ,   TRUE FALSE */


 typedef int ElemType;
 //#include"c2-2.h" /*    algo2-2.c   */
  /* c2-2.h             */
 struct LNode
 {
   ElemType data;
   struct LNode *next;
 };
 typedef struct LNode *LinkList; /*      LinkList    */


 //#include"bo2-2.c" /*    algo2-2.c   */
  /* bo2-2.c       (     c2-2.h  )     (12 ) */
 Status InitList(LinkList *L)
 { /*     :         L */
   *L=(LinkList)malloc(sizeof(struct LNode)); /*      ,  L       */
   if(!*L) /*        */
     exit(OVERFLOW);
   (*L)->next=NULL; /*       */
   return OK;
 }

 Status DestroyList(LinkList *L)
 { /*     :   L   。    :     L */
   LinkList q;
   while(*L)
   {
     q=(*L)->next;
     free(*L);
     *L=q;
   }
   return OK;
 }

 Status ClearList(LinkList L) /*    L */
 { /*     :   L   。    : L      */
   LinkList p,q;
   p=L->next; /* p        */
   while(p) /*      */
   {
     q=p->next;
     free(p);
     p=q;
   }
   L->next=NULL; /*          */
   return OK;
 }

 Status ListEmpty(LinkList L)
 { /*     :   L   。    : L   ,   TRUE,    FALSE */
   if(L->next) /*    */
     return FALSE;
   else
     return TRUE;
 }

 int ListLength(LinkList L)
 { /*     :   L   。    :  L        */
   int i=0;
   LinkList p=L->next; /* p        */
   while(p) /*      */
   {
     i++;
     p=p->next;
   }
   return i;
 }

 Status GetElem(LinkList L,int i,ElemType *e) /*   2.8 */
 { /* L             。  i      ,    e   OK,    ERROR */
   int j=1; /* j     */
   LinkList p=L->next; /* p        */
   while(p&&j<i) /*        ,  p   i    p   */
   {
     p=p->next;
     j++;
   }
   if(!p||j>i) /*  i       */
     return ERROR;
   *e=p->data; /*   i    */
   return OK;
 }

 int LocateElem(LinkList L,ElemType e,Status(*compare)(ElemType,ElemType))
 { /*     :    L   ,compare()         (   1,   0) */
   /*     :   L  1  e    compare()        。 */
   /*                      ,     0 */
   int i=0;
   LinkList p=L->next;
   while(p)
   {
     i++;
     if(compare(p->data,e)) /*           */
       return i;
     p=p->next;
   }
   return 0;
 }

 Status PriorElem(LinkList L,ElemType cur_e,ElemType *pre_e)
 { /*     :    L    */
   /*     :  cur_e L     ,      ,  pre_e      , */
   /*             OK;      ,pre_e   ,  INFEASIBLE */
   LinkList q,p=L->next; /* p        */
   while(p->next) /* p        */
   {
     q=p->next; /* q p    */
     if(q->data==cur_e)
     {
       *pre_e=p->data;
       return OK;
     }
     p=q; /* p    */
   }
   return INFEASIBLE;
 }

 Status NextElem(LinkList L,ElemType cur_e,ElemType *next_e)
 { /*     :   L    */
   /*     : cur_e L     ,       ,  next_e      , */
   /*             OK;      ,next_e   ,  INFEASIBLE */
   LinkList p=L->next; /* p        */
   while(p->next) /* p        */
   {
     if(p->data==cur_e)
     {
       *next_e=p->next->data;
       return OK;
     }
     p=p->next;
   }
   return INFEASIBLE;
 }

 Status ListInsert(LinkList L,int i,ElemType e) /*   2.9。   L */
 { /*            L  i         e */
   int j=0;
   LinkList p=L,s;
   while(p&&j<i-1) /*    i-1    */
   {
     p=p->next;
     j++;
   }
   if(!p||j>i-1) /* i  1       */
     return ERROR;
   s=(LinkList)malloc(sizeof(struct LNode)); /*       */
   s->data=e; /*   L  */
   s->next=p->next;
   p->next=s;
   return OK;
 }

 Status ListDelete(LinkList L,int i,ElemType *e) /*   2.10。   L */
 { /*            L ,   i   ,  e     */
   int j=0;
   LinkList p=L,q;
   while(p->next&&j<i-1) /*    i   ,  p      */
   {
     p=p->next;
     j++;
   }
   if(!p->next||j>i-1) /*         */
     return ERROR;
   q=p->next; /*         */
   p->next=q->next;
   *e=q->data;
   free(q);
   return OK;
 }

 Status ListTraverse(LinkList L,void(*vi)(ElemType))
 /* vi      ElemType, bo2-1.c          ElemType&   */
 { /*     :   L    */
   /*     :   L           vi()。  vi()  ,      */
   LinkList p=L->next;
   while(p)
   {
     vi(p->data);
     p=p->next;
   }
   printf("
"
); return OK; } void MergeList(LinkList La,LinkList Lb,LinkList *Lc) /* 2.2, algo2-2.c */ { /* La Lb 。 */ /* La Lb Lc,Lc */ int i=1,j=1,k=0; int La_len,Lb_len; ElemType ai,bj; InitList(Lc); /* Lc */ La_len=ListLength(La); Lb_len=ListLength(Lb); while(i<=La_len&&j<=Lb_len) /* La Lb */ { 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) /* La Lb */ { GetElem(La,i++,&ai); ListInsert(*Lc,++k,ai); } while(j<=Lb_len) /* Lb La */ { GetElem(Lb,j++,&bj); ListInsert(*Lc,++k,bj); } } void print(ElemType c) { printf("%d ",c); } int main() { LinkList La,Lb,Lc; /* algo2-2.c */ int j,a[4]={3,5,8,11},b[7]={2,6,8,9,11,15,20}; InitList(&La); /* La */ for(j=1;j<=4;j++) /* La 4 */ ListInsert(La,j,a[j-1]); printf("La= "); /* La */ ListTraverse(La,print); InitList(&Lb); /* Lb */ for(j=1;j<=7;j++) /* Lb 7 */ ListInsert(Lb,j,b[j-1]); printf("Lb= "); /* Lb */ ListTraverse(Lb,print); MergeList(La,Lb,&Lc); printf("Lc= "); /* Lc */ ListTraverse(Lc,print); }