- 顺序表的基本操作
View Code1 #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 Code1 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 Code1 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 }

浙公网安备 33010602011771号