先赞后看,养成习惯!!! ^ _ ^❤️ ❤️ ❤️
如有错误,还请您批评改正^ _ ^
代码实现
顺序表思想在之前的文章中数据结构复习——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); }
- 满足随机存取,时间复杂度O(1)。
- 插入删除元素较复杂,时间复杂度O(n)。
- 需要扩容。
- 适用场景:数据的高效存取 + 频繁读取。
总结
本文介绍了顺序表(SeqList)的C语言实现代码。主要内容包括:顺序表的结构体定义(包含数据指针、大小和容量)、初始化函数、判满判空函数、扩容函数(默认2倍)、插入删除操作(任意位置/头插尾插/头删尾删)、查找元素、按值删除等核心功能。文章提供了完整的测试用例,展示了各功能的使用方法。代码实现了顺序表的基本操作,包括动态扩容机制,适合作为数据结构学习的实践参考。