amur-leopard

导航

顺序线性表

  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 init(seq_list &list); // 初始化线性表
 32 status insert(seq_list &list, int i, int e); // 向线性表中某个位置前插入新元素
 33 status list_delete(seq_list &list, int i, int &e); // 删除线性表中某个位置的元素
 34 status print(seq_list list); // 打印线性表
 35 
 36 
 37 //------------------基本操作的实现--------------------
 38 /**
 39  * @brief 初始化线性表
 40  *
 41  * @param list 待初始化的线性表
 42  *
 43  * @return 函数状态
 44  */
 45 status 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 insert(seq_list &list, int i, int e)
 67 {
 68     int j; // 用于循环
 69     int *newbase; // 新存储空间的基址
 70     if(i < 1 || i > list.list_length + 1) // 错误的插入位置
 71     {
 72         return ERROR;
 73     }
 74     if(list.list_length >= list.list_size) // 存储空间已满
 75     {
 76         // 增加存储空间
 77         newbase = (int *)realloc(list.elem, (list.list_size + LIST_INCREMENT) * sizeof(int));
 78         if(!newbase)
 79         {
 80             exit(OVERFLOW);
 81         }
 82         list.elem = newbase;
 83         list.list_size += LIST_INCREMENT;
 84     }
 85     for(j = list.list_length - 1; j >= i - 1; --j) // 循环后移
 86     {
 87         *(list.elem + j + 1) = *(list.elem + j);
 88     }
 89     *(list.elem + j + 1) = e;
 90     ++list.list_length;
 91     return OK;
 92 }
 93 
 94 /**
 95  * @brief 删除线性表中某个位置的元素
 96  *
 97  * @param list 待删除元素所在的线性表
 98  * @param i 删除位置(1<=i<=list_length)
 99  * @param e 用于返回待删除元素
100  *
101  * @return 函数状态
102  */
103 status list_delete(seq_list &list, int i, int &e)
104 {
105     int j; // 用于循环
106     if(i < 1 || i > list.list_length) // 错误的删除位置
107     {
108         return ERROR;
109     }
110     e = *(list.elem + i - 1);
111     for(j = i; j < list.list_length; ++j)
112     {
113         *(list.elem + j - 1) = *(list.elem + j);
114     }
115     --list.list_length;
116     return OK;
117 }
118 
119 /**
120  * @brief 打印线性表
121  *
122  * @param 待打印的线性表
123  *
124  * @return 函数状态
125  */
126 status print(seq_list list)
127 {
128     int i; // 用于循环
129     if(list.list_length > 0)
130     {
131         printf("%d", *list.elem);
132         for(i = 1; i < list.list_length; ++i)
133         {
134             printf(" %d", *(list.elem + i));
135         }
136         printf("\n");
137     }
138     return OK;
139 }
140 
141 
142 //-----------------------测试-------------------------
143 /**
144  * @brief 测试函数
145  */
146 void main()
147 {
148     int e; seq_list list; init(list);
149 
150     if(OK == print(list)) printf("print succeed!\n");
151 
152     if(OK == insert(list, 1, 11)) printf("insert (1, 11) succeed!\n"); print(list);
153     if(OK == insert(list, 2, 22)) printf("insert (2, 22) succeed!\n"); print(list);
154     if(OK == insert(list, 1, 33)) printf("insert (1, 33) succeed!\n"); print(list);
155     if(OK == insert(list, 2, 44)) printf("insert (2, 44) succeed!\n"); print(list);
156     if(OK == insert(list, 3, 55)) printf("insert (3, 55) succeed!\n"); print(list);
157 
158     if(OK == list_delete(list, 5, e)) printf("list_delete (5, %d) succeed!\n", e); print(list);
159     if(OK == list_delete(list, 2, e)) printf("list_delete (2, %d) succeed!\n", e); print(list);
160     if(OK == list_delete(list, 1, e)) printf("list_delete (1, %d) succeed!\n", e); print(list);
161     if(OK == list_delete(list, 1, e)) printf("list_delete (1, %d) succeed!\n", e); print(list);
162     if(OK == list_delete(list, 1, e)) printf("list_delete (1, %d) succeed!\n", e); print(list);
163 
164     if(OK == print(list)) printf("print succeed!\n");
165 
166     system("pause");
167 }

posted on 2014-06-01 15:08  amur-leopard  阅读(216)  评论(0)    收藏  举报