当前位置: 首页 > news >正文

【 C 语言实现顺序表的基本操作】(数据结构)

C 语言实现顺序表的基本操作(入门教程)

在这里插入图片描述

1. 引言

顺序表(Sequential List)是一种 线性表 的存储结构,它使用 一段连续的内存空间 来存储数据。由于存储位置是连续的,顺序表支持 快速读取,但 插入和删除操作 可能涉及大量的数据移动,因此性能相对较低。本文将详细介绍 C 语言 下顺序表的基本操作,并提供完整的代码示例,供初学者学习。


2. 顺序表的基本概念

顺序表是 数组 在逻辑上的扩展,包含:

  • 数据存储区(数组 data[]):用于存放元素。
  • 长度标记(变量 length):记录当前顺序表的元素个数。

顺序表的特点

支持随机访问,即可以使用 O(1) 时间访问指定元素。
插入/删除操作复杂,需要移动大量元素,最坏情况时间复杂度为 O(n)


3. 顺序表的基本操作

接下来,我们使用 C 语言实现以下基本功能:

  1. 初始化顺序表
  2. 插入元素
  3. 删除元素
  4. 查找元素
  5. 打印顺序表

4. C 语言实现顺序表

#include <stdio.h>
#include <stdlib.h>

#define MaxSize 50  // 顺序表的最大容量

typedef int ElemType;  // 定义数据类型

// 定义顺序表结构
typedef struct {
    ElemType data[MaxSize];  // 存储数据的数组
    int length;  // 记录顺序表当前的长度
} SqList;

// 1. 初始化顺序表
void InitList(SqList *L) {
    L->length = 0;  // 初始长度为 0
}

// 2. 插入元素
int Insert(SqList *L, int i, ElemType e) {
    if (i < 1 || i > L->length + 1) {  // 检查插入位置是否合法
        printf("插入位置不合法!\n");
        return 0;
    }
    if (L->length == MaxSize) {  // 顺序表已满
        printf("顺序表已满,无法插入!\n");
        return 0;
    }
    for (int j = L->length; j >= i; j--) {  // 从最后一个元素开始向后移动
        L->data[j] = L->data[j - 1];
    }
    L->data[i - 1] = e;  // 插入元素
    L->length++;  // 表长加 1
    return 1;
}

// 3. 删除元素
int Delete(SqList *L, int i, ElemType *e) {
    if (i < 1 || i > L->length) {  // 检查删除位置是否合法
        printf("删除位置不合法!\n");
        return 0;
    }
    *e = L->data[i - 1];  // 取出被删除的元素
    for (int j = i; j < L->length; j++) {  // 从删除位置开始,后续元素前移
        L->data[j - 1] = L->data[j];
    }
    L->length--;  // 表长减 1
    return 1;
}

// 4. 查找元素
int LocateElem(SqList L, ElemType x) {
    for (int i = 0; i < L.length; i++) {
        if (L.data[i] == x) {
            return i + 1;  // 返回逻辑位置(从 1 开始)
        }
    }
    return 0;  // 查找失败返回 0
}

// 5. 打印顺序表
void PrintList(SqList L) {
    printf("顺序表当前元素:");
    for (int i = 0; i < L.length; i++) {
        printf("%d ", L.data[i]);
    }
    printf("\n");
}

// 主函数
int main() {
    SqList L;
    InitList(&L);  // 初始化顺序表

    // 插入一些数据
    Insert(&L, 1, 10);
    Insert(&L, 2, 20);
    Insert(&L, 3, 30);
    Insert(&L, 4, 40);
    PrintList(L);  // 输出:10 20 30 40

    // 在第二个位置插入 15
    Insert(&L, 2, 15);
    PrintList(L);  // 输出:10 15 20 30 40

    // 删除第三个元素
    ElemType e;
    Delete(&L, 3, &e);
    printf("删除的元素是:%d\n", e);
    PrintList(L);  // 输出:10 15 30 40

    // 查找元素
    int pos = LocateElem(L, 30);
    if (pos) {
        printf("元素 30 位于顺序表的第 %d 位置。\n", pos);
    } else {
        printf("元素 30 不在顺序表中。\n");
    }

    return 0;
}

5. 运行结果

顺序表当前元素:10 20 30 40 
顺序表当前元素:10 15 20 30 40 
删除的元素是:20
顺序表当前元素:10 15 30 40 
元素 30 位于顺序表的第 3 位置。

6. 代码讲解

1️⃣ 初始化顺序表

void InitList(SqList *L) {
    L->length = 0;  // 初始长度为 0
}
  • 这里的 SqList *L 代表传入 顺序表的指针,让函数可以直接修改结构体内容。

2️⃣ 插入操作

int Insert(SqList *L, int i, ElemType e) {
    if (i < 1 || i > L->length + 1) {  
        printf("插入位置不合法!\n");
        return 0;
    }
    if (L->length == MaxSize) {  
        printf("顺序表已满,无法插入!\n");
        return 0;
    }
    for (int j = L->length; j >= i; j--) {  
        L->data[j] = L->data[j - 1];  
    }
    L->data[i - 1] = e;  
    L->length++;  
    return 1;
}
  • 检查插入位置是否合法,防止越界。
  • 移动元素,确保插入元素后顺序不变。
  • 更新 length,插入完成后 表长+1

3️⃣ 删除操作

int Delete(SqList *L, int i, ElemType *e) {
    if (i < 1 || i > L->length) {  
        printf("删除位置不合法!\n");
        return 0;
    }
    *e = L->data[i - 1];  
    for (int j = i; j < L->length; j++) {  
        L->data[j - 1] = L->data[j];  
    }
    L->length--;  
    return 1;
}
  • 保存被删除的元素,避免数据丢失。
  • 移动元素,确保删除后顺序不变。
  • 更新 length,删除完成后 表长-1

7. 总结

本文介绍了 C 语言实现顺序表 的基本操作,包括 插入、删除、查找和打印
✅ 适合小白学习,理解顺序表的原理和实现方式。
⚠️ 需要注意 数据移动的影响,避免数组越界错误。

➡️ 顺序表适用于需要 快速访问 但插入删除较少的场景。如果需要频繁插入/删除数据,建议使用 链表 代替。💡

相关文章:

  • 使用matlab进行分位数回归
  • 三数之和
  • B494:开关电源领域的PWM控制新星
  • [特殊字符] AI 编程工具推荐与场景指南 ——提升研发效率的智能助
  • 练习题:109
  • 【机密计算顶会解读】12:机密提示——保护云LLM推理服务中的用户提示词
  • vue将页面导出成word
  • LLM架构解析:NLP基础(第一部分)—— 模型、核心技术与发展历程全解析
  • NO.59十六届蓝桥杯备战|基础算法-前缀和|一维前缀和|最大子段和|二维前缀和|激光炸弹(C++)
  • Dubbo(21)如何配置Dubbo的注册中心?
  • DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加行拖拽排序功能示例7,TableView16_07 列拖拽排序示例
  • Java 开发中的 AI 黑科技:如何用 AI 工具自动生成 Spring Boot 项目脚手架?
  • Python中的装饰器
  • 刘火良FreeRTOS内核实现与应用学习之6——多优先级
  • 蓝桥杯备考:模拟算法之排队接水
  • skynet.socket.limit 使用详解
  • 数据结构每日一题day5(顺序表)★★★★★
  • 为mariadb和mysql添加用户和修改密码的方法
  • 树莓派 —— 在树莓派4b板卡下编译FFmpeg源码,支持硬件编解码器(mmal或openMax硬编解码加速)
  • 清华大学第10讲:迈向未来的AI教学实验396页PPT 探索未来教育的无限可能|附PPT下载方法
  • 女孩患异食癖爱吃头发,一年后腹痛入院体内惊现“头发巨石”
  • 为何选择上海?两家外企提到营商环境、人才资源……
  • 今年前4个月上海对拉美国家进出口总值增长2%
  • 国际能源署:全球电动汽车市场强劲增长,中国市场继续领跑
  • 多个侵华日军细菌战部队留守名簿文件首次公布
  • 夜读|尊重生命的棱角