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 */