线性表的顺序存储结构

线性表的顺序存储结构:

1 /*

2 ** 线性表的顺序存储结构 */

3 #define SQLIST_INIT_SIZE 100 //顺序表存储空间初始分配量

4 #define SQLIST_INCREMENT 10  //存储空间分配增量

5 typedef struct tagSqList {

6     ListElemType *data;//线性表存储数据基地址

7              int  length;//线性表长度(当前元素个数)

8              int  size;//为线性表分配的存储空间大小(以sizeof(ListElemType)为单位)

9 }SqList;

线性表的基本操作:

  1 #include "sqlist_algo.h"

  2 #include <stdlib.h>

  3 #include <memory.h>

  4 

  5 /*

  6 ** 构造一个空的线性顺序表,并将长度设置为0

  7 */

  8 void SqList_Init(SqList *list)

  9 {

 10     list->data = (ListElemType *)malloc(SQLIST_INIT_SIZE*sizeof(ListElemType));

 11     if (!list->data) exit(EXIT_FAILURE);//存储空间分配失败

 12     list->length = 0;//线性表长度(当前元素个数)设置为0

 13     list->size = SQLIST_INIT_SIZE;//为线性表分配的存储空间大小

 14 }

 15 

 16 /*

 17 ** 插入

 18 */

 19 int SqList_Insert(SqList *list, int index, ListElemType elem)

 20 {

 21     ListElemType *base, *pMove, *pInsert;

 22     if (index < 1 || index > list->length + 1) return 0;//参数出错

 23     if (list->length == list->size){//当前存储空间已满

 24         base = (ListElemType *)realloc(list->data, 

 25             (list->size + SQLIST_INCREMENT) * sizeof(ListElemType));

 26         if (!base) exit(EXIT_FAILURE);

 27         list->data = base;//将新申请的内存空间首地址赋给data

 28         list->size += SQLIST_INCREMENT;//增加存储空间容量

 29     }

 30     pInsert = list->data + index - 1;//pInsert为插入位置,数组下标

 31     for (pMove = list->data + list->length - 1; pMove >= pInsert; --pMove){

 32         *(pMove+1) = *pMove;//插入位置及之后的元素依次后移(从表尾开始)

 33     }

 34     *pInsert = elem;//插入元素

 35     ++list->length;//表长加1

 36     return 1;

 37 }

 38 

 39 /*

 40 ** 判断是否为空

 41 */

 42 int SqList_Empty(SqList list)

 43 {

 44     if (list.length == 0) return 1;

 45     return 0;

 46 }

 47 

 48 /*

 49 ** 获取表长

 50 */

 51 int SqList_Length(SqList list)

 52 {

 53     return list.length;

 54 }

 55 

 56 /*

 57 ** 遍历线性表

 58 */

 59 void SqList_Traverse(SqList list, void (*visit)(ListElemType))

 60 {

 61     ListElemType *p = list.data;//p指向第一个元素

 62     int i;

 63     for (i = 1; i <= list.length; i++){

 64         visit(*p++);

 65     }

 66 }

 67 

 68 /*

 69 ** 删除

 70 */

 71 int SqList_Delete(SqList *list, int index, ListElemType *elem)

 72 {

 73     ListElemType *pDel, *pTail;

 74     if (index < 1 || index > list->length) return 0;//参数非法

 75     pDel = list->data + index - 1;//pDel指向待删除元素位置

 76     *elem = *pDel;//被删除元素值赋给elem

 77     pTail = list->data + list->length - 1;//pTail指向表尾元素位置

 78     for (++pDel; pDel <= pTail; ++pDel){

 79         *(pDel - 1) = *pDel;//被删除元素以后的元素依次向前移动一位

 80     }

 81     list->length--;//表长减1

 82     return 1;

 83 }

 84 

 85 /*

 86 ** 定位,返回与elem满足compare()关系的元素的位置

 87 */

 88 int SqList_Locate(SqList list, ListElemType elem, int (*compare)(ListElemType, ListElemType))

 89 {

 90     int i = 1;//初始值为第一个元素的位序

 91     ListElemType *p = list.data;//p指向第一个元素位置

 92     while (i <= list.length && !compare(elem, *p++)){

 93         ++i;//没找到满足条件的就继续找

 94     }

 95     if (i <= list.length) return i;//找到

 96     return 0;//没有找到

 97 }

 98 

 99 /*

100 ** 清空

101 */

102 void SqList_Clear(SqList *list)

103 {

104     list->length = 0;

105 }

106 

107 /*

108 ** 销毁

109 */

110 void SqList_Destroy(SqList *list)

111 {

112     free(list->data);

113     list->data = NULL;

114     list->length = 0;

115     list->size = 0;

116 }

测试代码如下:

 1 #include <stdio.h>

 2 #include "sqlist_algo.h"

 3 

 4 void visit(ListElemType e)

 5 {

 6     printf(" %d ", e);

 7 }

 8 

 9 int compare(ListElemType e1, ListElemType e2)

10 {

11     if (e1 == e2) return 1;

12     return 0;

13 }

14 

15 //For Test

16 int main(int argc, char **argv)

17 {

18     SqList List;

19     ListElemType e;

20     int i = 0, index;

21     

22     //初始化空表

23     SqList_Init(&List);

24 

25     //插入元素

26     scanf("%d", &e);

27     while (e > 0){

28         SqList_Insert(&List, ++i, e);

29         scanf("%d", &e);

30     }

31     //判断是否为空

32     printf("Empty : %d\n", SqList_Empty(List));

33     //获取表长

34     printf("Length : %d\n", SqList_Length(List));

35     //遍历

36     SqList_Traverse(List, visit);

37     //删除

38     printf("\nDel Index: ");

39     scanf("%d", &index);

40     if (SqList_Delete(&List, index, &e)){

41         printf("Delete %d-th Element %d\n", index, e);

42     }

43     SqList_Traverse(List, visit);

44     //定位

45     printf("\nLocate : ");

46     scanf("%d", &e);

47     printf("Result: %d\n", SqList_Locate(List, e, compare));

48 

49     return 0;

50 }

 

你可能感兴趣的:(线性表)