当前位置:首页 > 系统教程 > 正文

C语言数据结构——顺序表超详解!!! (零基础也能学会的顺序表实现教程)

C语言数据结构——顺序表超详解!!! (零基础也能学会的顺序表实现教程)

欢迎来到C语言数据结构系列教程!今天我们将深入浅出地讲解顺序表,包括其定义、实现以及常见操作。无论你是刚接触数据结构的初学者,还是想复习C语言实现细节的开发者,本文都能帮助你彻底掌握C语言顺序表

什么是顺序表?

顺序表是线性表的一种顺序存储结构,它用一组地址连续的存储单元依次存储线性表中的数据元素。简单来说,就是通过数组来实现的线性表。与链表相比,顺序表支持随机访问,但插入和删除操作需要移动大量元素。在C语言中,我们可以使用静态数组或动态内存分配来实现顺序表。本文将重点介绍动态顺序表的实现,因为它在实际开发中更灵活。

C语言数据结构——顺序表超详解!!! (零基础也能学会的顺序表实现教程) C语言顺序表 顺序表实现 数据结构教程 动态顺序表 第1张

顺序表的结构定义

动态顺序表包含三个核心成员:指向堆内存的指针(用于存储元素)、当前表长(已使用元素个数)、以及当前容量(已分配的内存空间能容纳的最大元素个数)。当容量不足时,我们需要进行扩容。以下是结构体定义:

typedef struct {    int *data;      // 指向动态数组的指针    int length;     // 当前元素个数    int capacity;   // 当前容量} SeqList;

顺序表的基本操作(C语言实现)

下面我们将逐步实现顺序表的常用操作。所有函数均以指针方式操作顺序表,以便修改原结构。

1. 初始化

void InitList(SeqList L) {    L->data = (int)malloc(INIT_CAPACITY * sizeof(int));    if (!L->data) exit(1); // 内存分配失败处理    L->length = 0;    L->capacity = INIT_CAPACITY;}

2. 插入操作

在指定位置插入元素。需要检查位置合法性,若容量不足则扩容。

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++;}

3. 删除操作

删除指定位置的元素,并通过指针返回被删除的值。

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--;}

4. 查找元素

查找第一个等于给定值的元素位置,返回其位序(从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;}

5. 获取元素

根据位置获取元素值。

int GetElem(SeqList *L, int pos) {    if (pos < 1 || pos > L->length) {        printf("位置非法");        return -1; // 根据实际情况处理错误    }    return L->data[pos - 1];}

6. 修改元素

修改指定位置的元素值。

void SetElem(SeqList *L, int pos, int elem) {    if (pos < 1 || pos > L->length) {        printf("位置非法");        return;    }    L->data[pos - 1] = elem;}

7. 清空与销毁

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语言顺序表的底层原理和具体实现,从结构定义到各个操作都给出了完整的代码。掌握顺序表是学习更复杂数据结构(如栈、队列)的基础。希望这篇数据结构教程能帮助你打下坚实的基础。如果你对动态顺序表有任何疑问,欢迎在评论区留言讨论!

—— 本文完 ——