数据结构学习笔记(3)线性表-顺序映像
2011-01-06 15:53
211 查看
1 顺序储存结构-物理结构
2
3 线性表顺序储存结构的定义为:
4 #define LIST_INIT_SIZE 80 //线性表储存空间的初始分配量
5 #define LISTINCREMENT 10 //线性表储存空间的分配增量
6 typedef struct {
7 ElemType *elem; //存储空间基地址
8 int length; //当前长度
9 int listsize; //以sizeof(ElemType)为单位的当前分配的存储容量
10 } sqlist;
11 //构造一个空的线性表
12 status initlist_sq(sqlist &L){
13 L.elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType));
14 if(!L.elem) exit(OVERFLOW);
15 L.length = 0;
16 L.listsize = LIST_INIT_SIZE;
17 return OK;
18 }
19 //查找一个和e满足判定关系的元素
20 int locate_sq(sqlist L, ElemType e, status(*compare)(ElemType, ElemType)){
21 int i = 1; //i的初始值为第一个元素的位序
22 ElemType p = L.elem; //p的初值为第一个元素的储存位置
23 while(i <= L.length && !(*compare(*p++, e))){
24 ++i;
25 }
26 if(i <= L.length)
27 return i;
28 else
29 return 0;
30 }
31 //插入元素
32 status insert_sq(sqlist &L, int pos, ElemType e){
33 if(pos < 1 || pos > L.length)
34 return ERROR;
35 if(L.length >= L.listsize){ // 当前空间不足,再分配
36 newbase = (ElemType*)malloc(L.elem, (L.listsize + LISTINCREMENT)
37 *sizeof(ElemType));
38 if(!newbase)
39 exit(OVERFLOW);
40 L.elem = newbase; //新基地址
41 L.listsize += LISTINCREMENT;
42 }
43 q = &(L.elem[pos-1]); //q指示插入位置
44 //将q(包含q)后面的元素向后移动一位
45 for(p = &(L.elem[L.length-1]); p >=q; --p){
46 *(p+1) = *p;
47 }
48 *q = e;
49 ++L.length;
50 return OK;
51 }
52 /*
53 *移动元素次数:∑P(i)(n+1-i),如果P(i)都相等,则P=1/(n+1)
54 *移动元素期望值:n/2
55 */
56
57 //线性表的删除
58 status delete_sq(sqlist &L, int pos, ElemType &e){
59 if(pos < 1 || pos > L.length)
60 return ERROR;
61 p = &(L.elem[pos-1]);
62 e = *p;
63 q = L.elem + L.length - 1; //表尾元素的位置
64 for(++p; p <= q; ++p){
65 *(p-1) = *p;
66 }
67 --L.length;
68 return OK;
69 }
70 /*
71 *移动元素次数:∑P(i)(n-i) 从i+1到i+n,若P(i) = 1/n
72 *移动元素期望值:(n-1)/2
73 */
74
2
3 线性表顺序储存结构的定义为:
4 #define LIST_INIT_SIZE 80 //线性表储存空间的初始分配量
5 #define LISTINCREMENT 10 //线性表储存空间的分配增量
6 typedef struct {
7 ElemType *elem; //存储空间基地址
8 int length; //当前长度
9 int listsize; //以sizeof(ElemType)为单位的当前分配的存储容量
10 } sqlist;
11 //构造一个空的线性表
12 status initlist_sq(sqlist &L){
13 L.elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType));
14 if(!L.elem) exit(OVERFLOW);
15 L.length = 0;
16 L.listsize = LIST_INIT_SIZE;
17 return OK;
18 }
19 //查找一个和e满足判定关系的元素
20 int locate_sq(sqlist L, ElemType e, status(*compare)(ElemType, ElemType)){
21 int i = 1; //i的初始值为第一个元素的位序
22 ElemType p = L.elem; //p的初值为第一个元素的储存位置
23 while(i <= L.length && !(*compare(*p++, e))){
24 ++i;
25 }
26 if(i <= L.length)
27 return i;
28 else
29 return 0;
30 }
31 //插入元素
32 status insert_sq(sqlist &L, int pos, ElemType e){
33 if(pos < 1 || pos > L.length)
34 return ERROR;
35 if(L.length >= L.listsize){ // 当前空间不足,再分配
36 newbase = (ElemType*)malloc(L.elem, (L.listsize + LISTINCREMENT)
37 *sizeof(ElemType));
38 if(!newbase)
39 exit(OVERFLOW);
40 L.elem = newbase; //新基地址
41 L.listsize += LISTINCREMENT;
42 }
43 q = &(L.elem[pos-1]); //q指示插入位置
44 //将q(包含q)后面的元素向后移动一位
45 for(p = &(L.elem[L.length-1]); p >=q; --p){
46 *(p+1) = *p;
47 }
48 *q = e;
49 ++L.length;
50 return OK;
51 }
52 /*
53 *移动元素次数:∑P(i)(n+1-i),如果P(i)都相等,则P=1/(n+1)
54 *移动元素期望值:n/2
55 */
56
57 //线性表的删除
58 status delete_sq(sqlist &L, int pos, ElemType &e){
59 if(pos < 1 || pos > L.length)
60 return ERROR;
61 p = &(L.elem[pos-1]);
62 e = *p;
63 q = L.elem + L.length - 1; //表尾元素的位置
64 for(++p; p <= q; ++p){
65 *(p-1) = *p;
66 }
67 --L.length;
68 return OK;
69 }
70 /*
71 *移动元素次数:∑P(i)(n-i) 从i+1到i+n,若P(i) = 1/n
72 *移动元素期望值:(n-1)/2
73 */
74
相关文章推荐
- 线性表类型的实现-------顺序映像
- 线性表顺序存储
- 数据结构 线性顺序栈
- 数据结构与算法Java版——线性顺序表的实现
- C语言实现一般线性表的顺序存储
- 01线性表顺序存储_List--(线性表)
- 线性顺序表的简单操作
- [数据结构]线性表之顺序表的类模板实现
- 数据结构:线性表的顺序存储
- 线性表顺序存储的基本操作
- 线性表的顺序存储(一)--数组表示
- Java实现线性表-顺序表示和链式表示
- 线性顺序链表简单实现
- 线性表顺序存储的实现
- 线性表的顺序储存结构定义(动态)实现
- 线性代数matrix相乘中顺序的变化
- 线性表的顺序存储结构之顺序表类的实现_Java
- 顺序线性表的闲谈
- 线性表的顺序存储和链式存储