云中烛火

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  1. 顺序表的基本操作
      1 #include<string.h>
      2 #include<ctype.h>
      3 #include<malloc.h>
      4 #include<limits.h>
      5 #include<stdio.h>
      6 #include<stdlib.h>
      7 #include<math.h>
      8 
      9 
     10 #define TRUE 1
     11 #define FALSE 0
     12 #define OK 1
     13 #define ERROR 0
     14 #define INFEASIBLE -1
     15 
     16 typedef int Status;
     17 typedef int Boolean;
     18 typedef int ElemType;
     19 
     20 #define LIST_INIT_SIZE 10
     21 #define LISTINCREMENT 2
     22 typedef struct{
     23     ElemType *elem;
     24     int length;
     25     int listsize;
     26 }SqList;
     27 
     28 
     29 
     30 Status InitList(SqList *L){
     31     (*L).elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
     32     if(!(*L).elem)exit(OVERFLOW);
     33     (*L).length=0;
     34     (*L).listsize=LIST_INIT_SIZE;
     35     return OK;
     36 }
     37 
     38 Status DestroyList(SqList *L){
     39     free((*L).elem);
     40     (*L).elem=NULL;
     41     (*L).length=0;
     42     (*L).listsize=0;
     43     return OK;
     44 }
     45 
     46 Status ClearList(SqList *L){
     47     (*L).length=0;
     48     return OK;
     49 }
     50 
     51 Status ListEmpty(SqList L){
     52     if(L.length==0)
     53         return TRUE;
     54     else
     55         return FALSE;
     56 }
     57 
     58 Status ListLength(SqList L){
     59     /*
     60         初始条件:顺序线性表L已经存在。
     61         操作结果:返回L中的数据元素的个数
     62     */
     63     return L.length;
     64 }
     65 
     66 Status GetElem(SqList L,int i,ElemType *e){
     67     /*初始条件:顺序线性表L已经存在,1<=i<=ListLength(L)
     68        操作结果:用返回L中的第i个数据源素的值
     69     */
     70     if(i<1||i>L.length)
     71         exit(ERROR);
     72     *e=*(L.elem+i-1);
     73     return OK;
     74 }
     75 
     76 Status ListInsert(SqList *L,int i,ElemType e){
     77     ElemType *newbase,*q,*p;
     78     if(i<1||i>(*L).length+1)
     79         return ERROR;
     80     if((*L).length>=(*L).listsize){
     81         newbase=(ElemType *)realloc((*L).elem,((*L).listsize+LISTINCREMENT)*sizeof(ElemType));
     82         if(!newbase)
     83             exit(OVERFLOW);
     84         (*L).elem=newbase;
     85         (*L).listsize+=LISTINCREMENT;
     86     }
     87     q=(*L).elem+i-1;
     88     for(p=(*L).elem+(*L).length-1;p>=q;--p)
     89         *(p+1)=*p;
     90     *q=e;
     91     ++(*L).length;
     92     return OK;
     93 }
     94 
     95 Status LocateElem(SqList L,ElemType e,Status(*compare)(ElemType,ElemType)){
     96     /*
     97         初始条件:顺序线性表L已经存在,compare()是数据元素判定函数(满足为1,否则为0)
     98         操作结果:返回L中第一个与e满足关系compare()的数据元素的位序
     99     */
    100     ElemType *p;
    101     int i=1;
    102     p=L.elem;
    103     while(i<=L.length&&!compare(*p++,e))
    104         ++i;
    105     if(i<=L.length)
    106         return i;
    107     else
    108         return 0;
    109 }
    110 
    111 Status ListDelete(SqList *L,int i,ElemType *e){
    112     ElemType *p,*q;
    113     if(i<1||i>(*L).length)
    114         return ERROR;
    115     p=(*L).elem+i-1;
    116     *e=*p;
    117     q=(*L).elem+(*L).length-1;
    118     for(++p;p<=q;++p)
    119         *(p-1)=*p;
    120     (*L).length--;
    121     return OK;
    122 }
    123 
    124 Status ListTraverse(SqList L,void(*vi)(ElemType *)){
    125     /*
    126         初始条件:顺序线性表L已经存在
    127         操作结果:一次对L的每个数据元素调用vi(),一旦vi()失败,则操作失败
    128     */
    129     ElemType *p;
    130     int i;
    131     p=L.elem;
    132     for(i=1;i<=L.length;i++)
    133         vi(p++);
    134     printf("\n");
    135     return OK;
    136 }
    View Code
  2.  合并两个顺序表(去掉重复的数据元素)

     1 Status equal(ElemType c1,ElemType c2){
     2     if(c1==c2){
     3         return TRUE;
     4     }
     5     else
     6         return FALSE;
     7 }
     8 
     9 void Union(SqList *La,SqList Lb){
    10     ElemType e;
    11     int La_len,Lb_len;
    12     int i;
    13     La_len=ListLength(*La);
    14     Lb_len=ListLength(Lb);
    15     for(i=1;i<=Lb_len;i++){
    16         GetElem(Lb,i,&e);
    17         if(!LocateElem(*La,e,equal))
    18             ListInsert(La,++La_len,e);
    19 
    20     }
    21 }
    22 
    23 void print(ElemType *c){
    24     printf("%d  ",*c);
    25 }
    26 
    27 void main(){
    28     SqList La,Lb;
    29     Status i;
    30     int j;
    31     i=InitList(&La);
    32     if(i==1)
    33         for(j=1;j<=5;j++)
    34             i=ListInsert(&La,j,j);
    35     printf("La==");
    36     ListTraverse(La,print);
    37     InitList(&Lb);
    38     for(j=1;j<=5;j++)
    39         i=ListInsert(&Lb,j,2*j);
    40     printf("Lb=");
    41     ListTraverse(Lb,print);
    42     Union(&La,Lb);
    43     printf("new La=");
    44     ListTraverse(La,print);
    45 
    46 }
    View Code
  3. 归并两个顺序表,都按非递减排列
     1 void MergeList(SqList La,SqList Lb,SqList *Lc){
     2     int i=1,j=1,k=0;
     3     int La_len,Lb_len;
     4     ElemType ai,bj;
     5     InitList(Lc);
     6     La_len=ListLength(La);
     7     Lb_len=ListLength(Lb);
     8     while(i<=La_len&&j<=Lb_len){
     9         GetElem(La,i,&ai);
    10         GetElem(Lb,j,&bj);
    11         if(ai<=bj){
    12             ListInsert(Lc,++k,ai);
    13             ++i;
    14         }
    15         else{
    16             ListInsert(Lc,++k,bj);
    17             ++j;
    18         }
    19     }
    20     while(i<=La_len){
    21         GetElem(La,i++,&ai);
    22         ListInsert(Lc,++k,ai);
    23     }
    24     while(j<=Lb_len){
    25         GetElem(Lb,j++,&bj);
    26         ListInsert(Lc,++k,bj);
    27     }
    28 
    29 }
    30 
    31 void print(ElemType *c){
    32     printf("%d  ",*c);
    33 }
    34 
    35 void main(){
    36     SqList La,Lb,Lc;
    37     int j,a[4]={3,5,8,11},b[7]={2,6,8,9,11,15,20};
    38     InitList(&La);
    39     for(j=1;j<=4;j++)
    40         ListInsert(&La,j,a[j-1]);
    41     printf("La=");
    42     ListTraverse(La,print);
    43     InitList(&Lb);
    44     for(j=1;j<=7;j++)
    45         ListInsert(&Lb,j,b[j-1]);
    46     printf("Lb=");
    47     ListTraverse(Lb,print);
    48     MergeList(La,Lb,&Lc);
    49     printf("Lc=");
    50     ListTraverse(Lc,print);
    51 }
    View Code

     

posted on 2013-11-10 13:40  云中烛火  阅读(334)  评论(0)    收藏  举报