线性表的顺序存储结构

线性表的顺序存储结构:

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 }

 

posted @ 2015-05-11 10:24  XiaoManon  阅读(239)  评论(0编辑  收藏  举报