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 }
时间: 2024-08-09 06:19:27