首页 > 代码库 > 顺序线性表

顺序线性表

  1 /**
  2  * @brief 线性表的顺序表示与实现
  3  *
  4  * @author amur-leopard
  5  * 
  6  * @date 2014/06/01
  7  */
  8 #include <stdio.h>
  9 #include <stdlib.h>
 10 
 11 //-----------------预定义常量和类型-------------------
 12 #define OK           1
 13 #define ERROR        0
 14 #define OVERFLOW     -1
 15 
 16 typedef int status; // 函数类型,其值是函数结果状态代码
 17 
 18 
 19 //-----------线性表的动态分配顺序存储结构-------------
 20 #define LIST_INIT_SIZE 100 // 存储空间的初始分配量
 21 #define LIST_INCREMENT 10 // 存储空间的分配增量
 22 
 23 typedef struct{
 24     int *elem; // 存储空间基址
 25     int list_length; // 当前长度
 26     int list_size; // 当前分配的存储容量(以sizeof(ElemType)为单位)
 27 }seq_list;
 28 
 29 
 30 //------------------基本操作的声明--------------------
 31 status seq_list_init(seq_list &list); // 初始化线性表
 32 status seq_list_insert(seq_list &list, int i, int e); // 向线性表中某个位置前插入新元素
 33 status seq_list_delete(seq_list &list, int i, int &e); // 删除线性表中某个位置的元素
 34 status seq_list_print(seq_list list); // 打印线性表
 35 
 36 
 37 //------------------基本操作的实现--------------------
 38 /**
 39  * @brief 初始化线性表
 40  *
 41  * @param list 待初始化的线性表
 42  *
 43  * @return 函数状态
 44  */
 45 status seq_list_init(seq_list &list)
 46 {
 47     list.elem = (int *)malloc(LIST_INIT_SIZE * sizeof(int));
 48     if(!list.elem)
 49     {
 50         exit(OVERFLOW);
 51     }
 52     list.list_length = 0;
 53     list.list_size = LIST_INIT_SIZE;
 54     return OK;
 55 }
 56 
 57 /**
 58  * @brief 向线性表中某个位置前插入新元素
 59  *
 60  * @param list 待插入的线性表
 61  * @param i 插入位置(1<=i<=list_length+1)
 62  * @param e 待插入的元素
 63  *
 64  * @return 函数状态
 65  */
 66 status seq_list_insert(seq_list &list, int i, int e)
 67 {
 68     int j; // 用于循环
 69     if(i < 1 || i > list.list_length + 1) // 错误的插入位置
 70     {
 71         return ERROR;
 72     }
 73     if(list.list_length >= list.list_size) // 存储空间已满
 74     {
 75         // 增加存储空间
 76         int *newbase = (int *)realloc(list.elem, (list.list_size + LIST_INCREMENT) * sizeof(int));
 77         if(!newbase)
 78         {
 79             exit(OVERFLOW);
 80         }
 81         list.elem = newbase;
 82         list.list_size += LIST_INCREMENT;
 83     }
 84     for(j = list.list_length - 1; j >= i - 1; --j) // 循环后移
 85     {
 86         *(list.elem + j + 1) = *(list.elem + j);
 87     }
 88     *(list.elem + j + 1) = e;
 89     ++list.list_length;
 90     return OK;
 91 }
 92 
 93 /**
 94  * @brief 删除线性表中某个位置的元素
 95  *
 96  * @param list 待删除元素所在的线性表
 97  * @param i 删除位置(1<=i<=list_length)
 98  * @param e 用于返回待删除元素的值
 99  *
100  * @return 函数状态
101  */
102 status seq_list_delete(seq_list &list, int i, int &e)
103 {
104     int j; // 用于循环
105     if(i < 1 || i > list.list_length) // 错误的删除位置
106     {
107         return ERROR;
108     }
109     e = *(list.elem + i - 1);
110     for(j = i; j < list.list_length; ++j)
111     {
112         *(list.elem + j - 1) = *(list.elem + j);
113     }
114     --list.list_length;
115     return OK;
116 }
117 
118 /**
119  * @brief 打印顺序表
120  *
121  * @return 函数状态
122  */
123 status seq_list_print(seq_list list)
124 {
125     int i; // 用于循环
126     if(list.list_length > 0)
127     {
128         printf("%d", *list.elem);
129         for(i = 1; i < list.list_length; ++i)
130         {
131             printf(" %d", *(list.elem + i));
132         }
133         printf("\n");
134     }
135     return OK;
136 }
137 
138 
139 //-----------------------测试-------------------------
140 /**
141  * @brief 测试函数
142  */
143 void main()
144 {
145     int e; seq_list list; seq_list_init(list);
146 
147     if(OK == seq_list_print(list)) printf("print succeed!\n");
148 
149     if(OK == seq_list_insert(list, 1, 11)) printf("insert (1, 11) succeed!\n"); seq_list_print(list);
150     if(OK == seq_list_insert(list, 2, 22)) printf("insert (2, 22) succeed!\n"); seq_list_print(list);
151     if(OK == seq_list_insert(list, 1, 33)) printf("insert (1, 33) succeed!\n"); seq_list_print(list);
152     if(OK == seq_list_insert(list, 2, 44)) printf("insert (2, 44) succeed!\n"); seq_list_print(list);
153     if(OK == seq_list_insert(list, 3, 55)) printf("insert (3, 55) succeed!\n"); seq_list_print(list);
154 
155     if(OK == seq_list_delete(list, 5, e)) printf("delete (5, %d) succeed!\n", e); seq_list_print(list);
156     if(OK == seq_list_delete(list, 2, e)) printf("delete (2, %d) succeed!\n", e); seq_list_print(list);
157     if(OK == seq_list_delete(list, 1, e)) printf("delete (1, %d) succeed!\n", e); seq_list_print(list);
158     if(OK == seq_list_delete(list, 1, e)) printf("delete (1, %d) succeed!\n", e); seq_list_print(list);
159     if(OK == seq_list_delete(list, 1, e)) printf("delete (1, %d) succeed!\n", e); seq_list_print(list);
160 
161     if(OK == seq_list_print(list)) printf("print succeed!\n");
162 
163     system("pause");
164 }