1 /* 2 顺序存储的结构 3 */ 4 #define MAXSIZE 20 5 //存储空间初始分配量 6 typedef int ElemType; 7 //ElemType类型根据实际情况而定,这里假设为int 8 typedef struct { 9 ElemType data[MAXSIZE]; 10 // 数组存储数据元素,最大值为MAXSIZE 11 int length; 12 // 线性表当前长度 13 } SqList; 14 /* 15 地址计算方法 16 17 每个数据元素,不管是整形、实型、字符型,它们都要占用一定的存储单元。 18 假设为c单元,那么线性表中第i个数据元素和第i+1个数据元素的存储位置满足 19 下列关系(LOC表述获得存储位置的函数): 20 LOC(a_i_) = LOC(a_i-1_)+c 21 (_表示下标的起始标志) 22 LOC(a_i) = LOC(a_1_)+(i-1)*c 23 24 计算线性表中任意位置的地址,时间相同。 25 对每个线性表位置的存入或者取出数据,对于计算机而言,均为相等的时间,为一个常熟。 26 时间复杂度 27 存取时间性能 28 O(1) 29 30 */ 31 32 /* 33 顺序存储结构的插入与删除 34 */ 35 36 /*获得元素的操作*/ 37 #define OK 1 38 #define ERROR 0 39 #define TRUE 1 40 #define FALSE 0 41 typedef int Status; 42 //Status 是函数的类型,其值是函数结果状态码,如OK 43 //初始条件:顺序线性表L已存在,1<=i<=ListLength(L) 44 //操作结果:用e返回L中第i个数据元素的值 45 Status GetElem(SqList L, int i, ElemType *e) { 46 if(L.length==0 || i<1 || i>L.length) 47 return ERROR; 48 *e=L.data[i-1]; 49 return OK; 50 } 51 //GetElem(L,i*e) 查 获得元素操作 52 //时间复杂度O(1) 53 54 /* 55 插入操作 56 */ 57 58 //ListInsert(*L,i,e) 增 添加元素操作 59 //初始条件:顺序线性表L已存在,i<=i<=ListLength(L) 60 //操作结果:在L中第i个位置之前插入新的数据元素e,L的长度增加1 61 Status ListInsert(SqList *L, int i, ElemType e) { 62 int k;//???improve下移? 63 if(L->length==MAXSIZE) 64 //顺序线性表已满 65 return ERROR; 66 if(L.length==0 || i<1 || i>L.length) 67 return ERROR; 68 if(i<=L->length) { 69 for(k=L->length-1; k>=i-1; k--) 70 L->data[k+1] = L->data[k]; 71 } 72 L->data[i-1]=e; 73 L->length++; 74 return OK; 75 } 76 /* 77 删除操作 78 */ 79 80 //初始条件:同上 81 //删除结果:删除L的第i个数据元素,并用e返回其值,L的长度减1 82 Status ListDelete(SqList *L, int i, ElemType *e) { 83 int k; 84 if(L->length==0) 85 //线性表为空 86 return ERROR; 87 if(i<1 || i>L->length) 88 return ERROR; 89 *e = L->data[i-1]; 90 if(i<L-length) { 91 for(k=i; k<L->length; k++) 92 L->data[k-1]=L->data[k]; 93 } 94 L->length--; 95 return OK; 96 } 97 98 /* 99 插入和删除的时间复杂度 100 最好的情况:元素要插入到最后一个位置或者删除最后一个元素 101 不需要移动元素 102 O(1) 103 最坏的情况:元素要插入到第一个位置或者删除第一个元素 104 需要移动所有元素 105 O(n) 106 每个位置插入或删除呀元素的可能性相同 107 平均复杂度 108 O(n) 109 */
时间: 2024-10-13 16:36:48