手搓顺序表(C语言) 先赞后看养成习惯 ^ _ ^❤️ ❤️ ❤️如有错误还请您批评改正^ _ ^代码实现顺序表思想在之前的文章中数据结构复习——ArrayList-CSDN博客已经进行了讲解这里不再过多赘述直接上代码。若有相关的 C语言指针相关知识点不清楚可移步至C语言万字复习-CSDN博客// 手搓顺序表元素下标从0开始 #include stdio.h #include malloc.h typedef struct SeqList { // 数据的地址即下标 int* data; // 有效数字的个数 int size; // 最大容量 int capacity; } SeqList; // 初始化顺序表 void initialSeqList(SeqList* seqList, int cap) { seqList-data (int*)malloc(sizeof (int) * cap); if (NULL seqList-data) { // 开辟内存失败 perror(malloc error); exit(1); } seqList-size 0; seqList-capacity cap; } // 判满满则返回1不满则返回0 int isFull(SeqList* sl) { return sl-size sl-capacity ? 1 : 0; } // 扩容默认扩大二倍 void extendDouble(SeqList* sl) { int newCapacity sl-capacity * 2; int* tem (int*) realloc(sl, newCapacity); if (NULL tem) { perror(extend error); exit(2); } sl-data tem; sl-capacity newCapacity; } // 判NULL是则返回1不是则返回0 int isNULL(SeqList* sl) { return NULL sl ? 1 : 0; } // 销毁 void destroy(SeqList* sl) { if (NULL sl) { return; } free(sl-data); sl-data NULL; sl-size 0; sl-capacity 0; } // 任意位置插入元素val int insert(SeqList* sl, int index, int val) { if(isNULL(sl)) return 0; // 判断输入下标是否合法 if (index sl-size || index 0) return 0; // 判断顺序表是否已满 if (isFull(sl)) { extendDouble(sl); } // 开始插入元素从后向前将元素依次向后移动 int i sl-size; while (i index) { *(sl-data i) *(sl-data i - 1); i--; } *(sl-data index) val; sl-size; return 1; } // 头插 int headInsert(SeqList* sl, int val) { return insert(sl, 0, val); } // 尾插 int tailInsert(SeqList* sl, int val) { return insert(sl, sl-size, val); } // 任意位置删除元素1成功0失败 int delete(SeqList* sl, int index) { if(isNULL(sl)) return 0; // 判断输入下标是否合法 if (index sl-size || index 0) return 0; // 开始覆盖 for (int i index; i sl-size - 1; i) { *(sl-data i) *(sl-data i 1); } sl-size--; return 1; } // 头删 int headDelete(SeqList* sl) { return delete(sl, 0); } // 尾删 int tailDelete(SeqList* sl) { return delete(sl, sl-size - 1); } // 查找第一个值为val的元素下标-1表示没找到 int select(SeqList* sl, int val) { if(isNULL(sl)) return -1; // 遍历顺序表寻找val值 for (int i 0; i sl-size; i) { int tem *(sl-data i); if (tem val) { return i; } } return -1; } // 删除第一个值为val的元素删除成功1失败0 int deleteByval(SeqList* sl, int val) { int tem select(sl, val); return delete(sl, tem); } // 打印顺序表 void printSl(SeqList* sl) { for (int i 0; i sl-size; i) { printf(%d , *(sl-data i)); } printf(\n); } int main() { SeqList sl; initialSeqList(sl, 10); // 初始数据 printf(insert : %d\n, insert(sl, 0, 1)); printf(insert : %d\n, insert(sl, 1, 3)); printf(insert : %d\n, insert(sl, 2, 2)); printf(insert : %d\n, insert(sl, 3, -1)); printSl(sl); // 头插 printf(headInsert : %d\n, headInsert(sl, -2)); printSl(sl); printf(headInsert : %d\n, headInsert(sl, -5)); printSl(sl); // 尾插法 printf(tailInsert : %d\n, tailInsert(sl, 7)); printSl(sl); printf(tailInsert : %d\n, tailInsert(sl, 8)); printSl(sl); // 删除任意下标的元素 printf(delete : %d\n, delete(sl, 1)); printSl(sl); // 尾删 printf(tailDelete : %d\n, tailDelete(sl)); printSl(sl); printf(headInsert : %d\n, headInsert(sl, -1)); printSl(sl); // 查找第一个值为val的元素下标-1表示没找到 printf(select : %d\n, select(sl, -1)); printSl(sl); // 删除第一个值为val的元素删除成功1失败0 printf(deleteByval : %d\n, deleteByval(sl, -1)); printSl(sl); printf(deleteByval : %d\n, deleteByval(sl, 8)); printSl(sl); }满足随机存取时间复杂度O1。插入删除元素较复杂时间复杂度On。需要扩容。适用场景数据的高效存取 频繁读取。总结本文介绍了顺序表(SeqList)的C语言实现代码。主要内容包括顺序表的结构体定义包含数据指针、大小和容量、初始化函数、判满判空函数、扩容函数默认2倍、插入删除操作任意位置/头插尾插/头删尾删、查找元素、按值删除等核心功能。文章提供了完整的测试用例展示了各功能的使用方法。代码实现了顺序表的基本操作包括动态扩容机制适合作为数据结构学习的实践参考。