news 2026/7/6 15:04:39

手搓顺序表(C语言)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
手搓顺序表(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); }
  • 满足随机存取,时间复杂度O(1)。
  • 插入删除元素较复杂,时间复杂度O(n)。
  • 需要扩容。
  • 适用场景:数据的高效存取 + 频繁读取。


总结

本文介绍了顺序表(SeqList)的C语言实现代码。主要内容包括:顺序表的结构体定义(包含数据指针、大小和容量)、初始化函数、判满判空函数、扩容函数(默认2倍)、插入删除操作(任意位置/头插尾插/头删尾删)、查找元素、按值删除等核心功能。文章提供了完整的测试用例,展示了各功能的使用方法。代码实现了顺序表的基本操作,包括动态扩容机制,适合作为数据结构学习的实践参考。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/6 15:03:47

YOLOv8可回收塑料识别分类检测系统(项目源码+YOLO数据集+模型权重+UI界面+python+深度学习+环境配置)

摘要 随着全球塑料污染问题日益严峻&#xff0c;高效、准确的可回收塑料自动分拣技术成为循环经济体系中的关键环节。本文基于YOLOv8目标检测算法&#xff0c;构建了一套可回收塑料识别与分类检测系统&#xff0c;涵盖七类常见塑料废弃物&#xff1a;HDPE Plastic、Multi-laye…

作者头像 李华
网站建设 2026/7/6 15:01:47

QRazyBox:让破损二维码重获新生的专业修复工具

QRazyBox&#xff1a;让破损二维码重获新生的专业修复工具 【免费下载链接】qrazybox QR Code Analysis and Recovery Toolkit 项目地址: https://gitcode.com/gh_mirrors/qr/qrazybox 你是否曾遇到过这样的情况&#xff1a;一张打印模糊的名片二维码无法扫描&#xff0…

作者头像 李华
网站建设 2026/7/6 15:00:58

读普林斯顿计算机公开课14未来

1. 人工智能1.1. 让计算机按照我们通常认为只属于人类独有的方式运行1.2. 图像识别系统可以非常有效地分离出图像的组成部分&#xff0c;然后给出这些组成部分是什么1.2.1. 用于识别癌细胞、视网膜疾病等类似疾病的医学图像处理有时与普通临床医生一样好&#xff0c;尽管还不如…

作者头像 李华
网站建设 2026/7/6 15:00:44

基于ICM-42605和STM32的高精度运动追踪系统设计

1. 项目背景与核心器件选型在嵌入式开发领域&#xff0c;精确追踪物体在三维空间中的运动和方向是一个极具挑战性的课题。无论是无人机飞控系统、VR/AR设备还是工业机器人&#xff0c;都需要实时获取物体的姿态和位置信息。要实现这一功能&#xff0c;我们需要两个核心组件&…

作者头像 李华
网站建设 2026/7/6 14:58:17

系统架构设计_agent-arch-system-design

以下为本文档的中文说明该技能专注于系统架构设计&#xff0c;负责高层次的技术决策和系统设计工作。其主要职责包括&#xff1a;设计可扩展、可维护的系统架构&#xff0c;记录架构决策并提供清晰的理由&#xff0c;创建系统交互图&#xff0c;评估技术选型和权衡&#xff0c;…

作者头像 李华