首页 > 代码库 > 顺序线性表
顺序线性表
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 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。