您的位置:首页 > 理论基础 > 数据结构算法

数据结构学习笔记(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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: