欢迎来到C语言数据结构系列教程!今天我们将深入浅出地讲解顺序表,包括其定义、实现以及常见操作。无论你是刚接触数据结构的初学者,还是想复习C语言实现细节的开发者,本文都能帮助你彻底掌握C语言顺序表。
顺序表是线性表的一种顺序存储结构,它用一组地址连续的存储单元依次存储线性表中的数据元素。简单来说,就是通过数组来实现的线性表。与链表相比,顺序表支持随机访问,但插入和删除操作需要移动大量元素。在C语言中,我们可以使用静态数组或动态内存分配来实现顺序表。本文将重点介绍动态顺序表的实现,因为它在实际开发中更灵活。
动态顺序表包含三个核心成员:指向堆内存的指针(用于存储元素)、当前表长(已使用元素个数)、以及当前容量(已分配的内存空间能容纳的最大元素个数)。当容量不足时,我们需要进行扩容。以下是结构体定义:
typedef struct { int *data; // 指向动态数组的指针 int length; // 当前元素个数 int capacity; // 当前容量} SeqList; 下面我们将逐步实现顺序表的常用操作。所有函数均以指针方式操作顺序表,以便修改原结构。
void InitList(SeqList L) { L->data = (int)malloc(INIT_CAPACITY * sizeof(int)); if (!L->data) exit(1); // 内存分配失败处理 L->length = 0; L->capacity = INIT_CAPACITY;} 在指定位置插入元素。需要检查位置合法性,若容量不足则扩容。
void ListInsert(SeqList *L, int pos, int elem) { if (pos < 1 || pos > L->length + 1) { printf("插入位置非法"); return; } // 如果容量不足,扩容为原来的两倍 if (L->length >= L->capacity) { L->data = (int*)realloc(L->data, L->capacity * 2 * sizeof(int)); L->capacity *= 2; } // 将pos之后的元素后移 for (int i = L->length - 1; i >= pos - 1; i--) { L->data[i + 1] = L->data[i]; } L->data[pos - 1] = elem; L->length++;} 删除指定位置的元素,并通过指针返回被删除的值。
void ListDelete(SeqList *L, int pos, int *elem) { if (pos < 1 || pos > L->length) { printf("删除位置非法"); return; } *elem = L->data[pos - 1]; for (int i = pos; i < L->length; i++) { L->data[i - 1] = L->data[i]; } L->length--;} 查找第一个等于给定值的元素位置,返回其位序(从1开始),若不存在返回0。
int LocateElem(SeqList *L, int elem) { for (int i = 0; i < L->length; i++) { if (L->data[i] == elem) { return i + 1; } } return 0;} 根据位置获取元素值。
int GetElem(SeqList *L, int pos) { if (pos < 1 || pos > L->length) { printf("位置非法"); return -1; // 根据实际情况处理错误 } return L->data[pos - 1];} 修改指定位置的元素值。
void SetElem(SeqList *L, int pos, int elem) { if (pos < 1 || pos > L->length) { printf("位置非法"); return; } L->data[pos - 1] = elem;} void ClearList(SeqList *L) { L->length = 0;}void DestroyList(SeqList *L) { free(L->data); L->data = NULL; L->length = L->capacity = 0;} 将以上函数整合,加上必要的头文件和主函数测试,即可得到一个完整的顺序表实现。这里提供一个简化的版本供参考:
#include #include #define INIT_CAPACITY 5typedef struct { int *data; int length; int capacity;} SeqList;// 所有函数实现(如上)// ...int main() { SeqList L; InitList(&L); // 插入测试 for (int i = 1; i <= 10; i++) { ListInsert(&L, i, i * 10); } printf("顺序表元素:"); for (int i = 1; i <= L.length; i++) { printf("%d ", GetElem(&L, i)); } printf(""); DestroyList(&L); return 0;} 本文详细讲解了C语言顺序表的底层原理和具体实现,从结构定义到各个操作都给出了完整的代码。掌握顺序表是学习更复杂数据结构(如栈、队列)的基础。希望这篇数据结构教程能帮助你打下坚实的基础。如果你对动态顺序表有任何疑问,欢迎在评论区留言讨论!
—— 本文完 ——
本文由主机测评网于2026-03-03发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/20260328293.html