単一サイクルチェーンテーブルに関する操作

4890 ワード

#include /* malloc()  */
 #include /* EOF(=^Z F6),NULL */
 #include /* atoi() */
 #include /* eof() */
 #include /* 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
struct LNode
 {
   ElemType data;
   struct LNode *next;
 };
 typedef struct LNode *LinkList; /*      LinkList    */
 /* bo2-4.c            (     c2-2.h  ) 12      */
 Status InitList_CL(LinkList *L)
 { /*     :         L */
   *L=(LinkList)malloc(sizeof(struct LNode)); /*      ,  L       */
   if(!*L) /*        */
     exit(OVERFLOW);
   (*L)->next=*L; /*          *////////
   return OK;
 }

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

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

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

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

 Status GetElem_CL(LinkList L,int i,ElemType *e)
 { /*   i      ,    e   OK,    ERROR */
   int j=1; /*    ,j     */
   LinkList p=L->next->next; /* p        */
   if(i<=0||i>ListLength_CL(L)) /*  i       */
     return ERROR;
   while(jnext;
     j++;
   }
   *e=p->data; /*   i    */
   return OK;
 }

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

 Status PriorElem_CL(LinkList L,ElemType cur_e,ElemType *pre_e)
 { /*     :   L    */
   /*     : cur_e L     ,      ,  pre_e      , */
   /*                 ,pre_e    */
   LinkList q,p=L->next->next; /* p        */
   q=p->next;
   while(q!=L->next) /* p     */
   {
     if(q->data==cur_e)
     {
       *pre_e=p->data;
       return TRUE;
     }
     p=q;
     q=q->next;
   }
   return FALSE;
 }

 Status NextElem_CL(LinkList L,ElemType cur_e,ElemType *next_e)
 { /*     :   L    */
   /*     : cur_e L     ,       ,  next_e      , */
   /*                 ,next_e    */
   LinkList p=L->next->next; /* p        */
   while(p!=L) /* p     */
   {
     if(p->data==cur_e)
     {
       *next_e=p->next->data;
       return TRUE;
     }
     p=p->next;
   }
   return FALSE;
 }

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

 Status ListDelete_CL(LinkList *L,int i,ElemType *e) /*   L */
 { /*   L  i   ,  e     */
   LinkList p=(*L)->next,q; /* p      */
   int j=0;
   if(i<=0||i>ListLength_CL(*L)) /*  i       */
     return ERROR;
   while(jnext;
     j++;
   }
   q=p->next; /* q        */
   p->next=q->next;
   *e=q->data;
   if(*L==q) /*          */
     *L=p;
   free(q); /*         */
   return OK;
 }

 Status ListTraverse_CL(LinkList L,void(*vi)(ElemType))
 { /*     :L   。    :   L           vi()。  vi()  ,      */
   LinkList p=L->next->next;
   while(p!=L->next)
   {
     vi(p->data);
     p=p->next;
   }
   printf("
"); return OK; } /* main2-4.c , bo2-4.c */ #include"c1.h" typedef int ElemType; #include"c2-2.h" #include"bo2-4.c" Status compare(ElemType c1,ElemType c2) { if(c1==c2) return TRUE; else return FALSE; } void visit(ElemType c) { printf("%d ",c); }