顺序线性表
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) 收藏 举报
浙公网安备 33010602011771号