线性表——顺序表的基本操作
线性表的顺序存储结构及其基本操作的实现
1 /* 2 Name: 顺序表的实现 3 Author: SUNPEISHUO 4 Date: 2017/11/03 22:00 5 */ 6 #ifndef SQLIST_H_INCLUDED 7 #define SQLIST_H_INCLUDED 8 #include "ds.h" //for Status,OK ... 9 #ifndef ElemType 10 #define ElemType int /* 数据元素类型默认为 int */ 11 #define ELEMTYPE_TAG 12 #endif 13 /********************************************************** 14 * 顺序表的存储结构定义 15 ***********************************************************/ 16 #define LIST_INIT_SIZE 100 /* 存储空间初始分配容量 */ 17 #define LISTINCREMENT 10 /* 存储空间分配的增量 */ 18 typedef struct { 19 ElemType *elem; //存储空间基址 20 int length; //当前长度 21 int listsize; //当前已分配的存储空间(元素个数) 22 } SqList; 23 24 /********************************************************** 25 * 顺序表的基本操作声明 26 ***********************************************************/ 27 28 //创建并初始化为空表 29 Status InitList(SqList &L); 30 //销毁整个表(从此之后不再可用) 31 Status DestroyList(SqList &L); 32 //将表L置空 33 Status ClearList(SqList &L); 34 //判断表L是否为空表 35 bool ListEmpty(SqList L); 36 //求表L的长度 37 int ListLength(SqList L); 38 //取表L中的第i个元素,并用e返回. 操作成功返回OK,失败时返回ERROR 39 Status GetElem(SqList L, int i, ElemType &e); 40 template <typename T> bool equal(T a, T b) 41 { 42 return a==b; 43 } 44 //在表L中定位元素e首次出现的位置. 操作成功返回位序,失败时返回0 45 int LocateElem(SqList L, ElemType e, bool (*compare)(ElemType,ElemType)=equal<ElemType>); 46 //在表L中插入第i个元素e. 操作成功返回OK,失败时返回ERROR 47 Status ListInsert(SqList &L, int i, ElemType e); 48 //删除表L中第i个元素,结果用e返回. 操作成功返回OK,失败时返回ERROR 49 Status ListDelete(SqList &L, int i, ElemType &e); 50 //遍历表L,对每个元素调用visit(x). 51 Status ListTraverse(SqList L, Status (*visit)(ElemType)); 52 53 /********************************************************** 54 * 顺序表的基本操作的实现 55 ***********************************************************/ 56 57 //创建并初始化为空表 58 Status InitList(SqList &L) 59 { L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType)); 60 if(!L.elem) return ERROR; 61 L.length=0; 62 L.listsize=LIST_INIT_SIZE; 63 return OK; 64 } 65 66 //销毁整个表(从此之后不再可用) 67 Status DestroyList(SqList &L) 68 { 69 return ERROR; 70 } 71 72 //将表L置空 73 Status ClearList(SqList &L) 74 { 75 L.length=0; 76 return OK; 77 } 78 79 //判断表L是否为空表 80 bool ListEmpty(SqList L) 81 { 82 if(L.length==0) return true; 83 else return false; 84 } 85 86 //求表L的长度 87 int ListLength(SqList L) 88 { 89 return L.length; 90 } 91 92 //取表L中的第i个元素,并用e返回. 操作成功返回OK,失败时返回ERROR 93 Status GetElem(SqList L, int i, ElemType &e) 94 { if(i<1||i>L.length) return ERROR; 95 e=L.elem[i-1]; 96 return OK; 97 } 98 99 //在表L中定位元素e首次出现的位置. 操作成功返回位序,失败时返回0 ,compare(a,b) 为比较函数,匹配时返回true,否则返回false 100 101 int LocateElem(SqList L, ElemType e, bool (*compare)(ElemType,ElemType)) 102 { 103 for (int j=0; j<L.length; j++) 104 if ( compare(L.elem[j],e) ) return j; 105 return 0; 106 } 107 108 109 //在表L中插入第i个元素e. 操作成功返回OK,失败时返回ERROR 110 Status ListInsert(SqList &L, int i, ElemType e) 111 { 112 if(i<0||i>L.length+1) return ERROR; 113 if(L.length>=L.listsize) 114 { 115 ElemType* newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType)); 116 if(!newbase) return ERROR; 117 L.elem=newbase; 118 L.listsize=L.listsize+LISTINCREMENT; 119 } 120 ElemType* q=&(L.elem[i-1]); 121 for(ElemType* p=&(L.elem[L.length-1]);p>=q;--p) 122 *(p+1)=*p; 123 *q=e; 124 L.length++; 125 return OK; 126 127 } 128 129 //删除表L中第i个元素,结果用e返回. 操作成功返回OK,失败时返回ERROR 130 Status ListDelete(SqList &L, int i, ElemType &e) 131 { if(i<1||i>L.length) return ERROR; 132 ElemType* p=&(L.elem[i-1]); 133 e=*p; 134 for(ElemType* q=&(L.elem[L.length-1]);p<=q;p++) 135 *p=*(p+1); 136 L.length--; 137 return OK; 138 } 139 140 //遍历表L,对每个元素调用visit(x). 141 Status ListTraverse(SqList L, Status (*visit)(ElemType)) 142 { 143 for (int j=0; j<L.length; j++) 144 if ( ! visit(L.elem[j]) ) return ERROR; 145 return OK; 146 } 147 148 #ifdef ELEMTYPE_TAG 149 #undef ElemType 150 #undef ELEMTYPE_TAG 151 #endif 152 #endif // SQLIST_H_INCLUDED