データ構造(手順表の2つの操作)

6758 ワード

順序表のA及びBの連結動作と、非逓減型の連続表を一つの非逓減型の順序表に結合する.
頭のファイルの内容が多いので、ここではincludeを使っていません.~ブログで~そのままコピーしました.~木に添削があります.
 #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;
 #define LIST_INIT_SIZE 10 
 #define LISTINCREMENT 2 
 typedef struct
 {
   ElemType *elem; 
   int length; 
   int listsize; 
 }SqList;

 
 //----start----------        (12 ) ----------------start---------------//
 Status InitList(SqList *L) 
 { /*     :            */
   (*L).elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
   if(!(*L).elem)
     exit(OVERFLOW); /*        */
   (*L).length=0; /*      0 */
   (*L).listsize=LIST_INIT_SIZE; /*        */
   return OK;
 }

 Status DestroyList(SqList *L)
 { /*     :     L   。    :       L */
   free((*L).elem);
   (*L).elem=NULL;
   (*L).length=0;
   (*L).listsize=0;
   return OK;
 }

 Status ClearList(SqList *L)
 { /*     :     L   。    : L      */
   (*L).length=0;
   return OK;
 }

 Status ListEmpty(SqList L)
 { /*     :     L   。    : L   ,   TRUE,    FALSE */
   if(L.length==0)
     return TRUE;
   else
     return FALSE;
 }

 int ListLength(SqList L)
 { /*     :     L   。    :  L        */
   return L.length;
 }

 Status GetElem(SqList L,int i,ElemType *e)
 { /*     :     L   ,1≤i≤ListLength(L) */
   /*     : e  L  i        */
   if(i<1||i>L.length)
     exit(ERROR);
   *e=*(L.elem+i-1);
   return OK;
 }

 int LocateElem(SqList L,ElemType e,Status(*compare)(ElemType,ElemType))
 { /*     :     L   ,compare()         (   1,   0) */
   /*     :  L  1  e    compare()        。 */
   /*                      ,     0。  2.6 */
   ElemType *p;
   int i=1; /* i     1       */
   p=L.elem; /* p     1         */
   while(i<=L.length&&!compare(*p++,e))
     ++i;
   if(i<=L.length)
     return i;
   else
     return 0;
 }

 Status PriorElem(SqList L,ElemType cur_e,ElemType *pre_e)
 { /*     :     L    */
   /*     : cur_e L     ,      ,  pre_e      , */
   /*                 ,pre_e    */
   int i=2;
   ElemType *p=L.elem+1;
   while(i<=L.length&&*p!=cur_e)
   {
     p++;
     i++;
   }
   if(i>L.length)
     return INFEASIBLE;
   else
   {
     *pre_e=*--p;
     return OK;
   }
 }

 Status NextElem(SqList L,ElemType cur_e,ElemType *next_e)
 { /*     :     L    */
   /*     : cur_e L     ,       ,  next_e      , */
   /*                 ,next_e    */
   int i=1;
   ElemType *p=L.elem;
   while(i<L.length&&*p!=cur_e)
   {
     i++;
     p++;
   }
   if(i==L.length)
     return INFEASIBLE;
   else
   {
     *next_e=*++p;
     return OK;
   }
 }

 Status ListInsert(SqList *L,int i,ElemType e) /*   2.4 */
 { /*     :     L   ,1≤i≤ListLength(L)+1 */
   /*     : L  i             e,L    1 */
   ElemType *newbase,*q,*p;
   if(i<1||i>(*L).length+1) /* i     */
     return ERROR;
   if((*L).length>=(*L).listsize) /*         ,     */
   {
     newbase=(ElemType *)realloc((*L).elem,((*L).listsize+LISTINCREMENT)*sizeof(ElemType));
     if(!newbase)
       exit(OVERFLOW); /*        */
     (*L).elem=newbase; /*     */
     (*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;
 }

 Status ListDelete(SqList *L,int i,ElemType *e) /*   2.5 */
 { /*     :     L   ,1≤i≤ListLength(L) */
   /*     :  L  i     ,  e    ,L    1 */
   ElemType *p,*q;
   if(i<1||i>(*L).length) /* i     */
     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--; /*    1 */
   return OK;
 }

 Status ListTraverse(SqList L,int (*vi)(ElemType*))
 { /*     :     L    */
   /*     :   L           vi()。  vi()  ,      */
   /*           vi()    '&',       vi()       */
   ElemType *p;
   int i;
   p=L.elem;
   for(i=1;i<=L.length;i++)
     vi(p++);
   printf("
"); return OK; } //---------end----- (12 ) ---------------end----------------// Status equal(ElemType c1,ElemType c2) { // ,Union() if(c1==c2) return TRUE; else return FALSE; } void Union(SqList &La,SqList Lb) // 2.1 { // Lb La La ElemType e; int La_len,Lb_len; int i; La_len=ListLength(La); // Lb_len=ListLength(Lb); for(i=1;i<=Lb_len;i++) { GetElem(Lb,i,&e); // Lb i e if(!LocateElem(La,e,equal)) // La e , ListInsert(&La,++La_len,e); } } int print(ElemType *c) { printf("%d ",*c); return 0; } void MergeList(SqList La,SqList Lb,SqList *Lc) /* 2.2 */ { /* 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); } } int main() { SqList La,Lb,Lc; Status i; int j; i=InitList(&La); if(i==1) // La for(j=1;j<=5;j++) // La 5 i=ListInsert(&La,j,j); printf("La= "); // La ListTraverse(La,print); InitList(&Lb); // for(j=1;j<=5;j++) // Lb 5 i=ListInsert(&Lb,j,2*j); printf("Lb= "); // Lb ListTraverse(Lb,print); Union(La,Lb); printf("new La= "); // La ListTraverse(La,print); InitList(&Lc);// Lc MergeList(La,Lb,&Lc); printf("
Lc= "); /* Lc */ ListTraverse(Lc,print); printf("
"); return 0; }