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

玩转顺序表:用 C 语言实现数据的插入与删除

目录

顺序表的定义

插入元素

删除元素 

查找元素 

主函数

打印顺序表

完整代码

总结


在这篇博客中,我们将探讨如何使用 C 语言实现一个简单的顺序表(也称为动态数组),并实现一些基本操作,包括插入、删除和查找元素。顺序表是一种线性数据结构,具有固定的大小,适合存储相同类型的元素。

顺序表的定义

首先,我们定义顺序表的结构。顺序表由一个数组和一个表示当前长度的变量组成。

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

typedef int ElemType; // 定义元素类型为整型

typedef struct {
    ElemType data[MaxSize]; // 存储元素的数组
    int length; // 当前顺序表的长度
} SqList;

在这里,MaxSize 定义了顺序表的最大容量,ElemType 定义了元素的类型为整型。

插入元素

我们实现了一个 ListInsert 函数,用于在顺序表的指定位置插入元素。该函数首先检查插入位置的有效性和顺序表是否已满,然后将插入位置及其后面的元素向后移动,最后在指定位置插入新元素。

bool ListInsert(SqList &L, int i, ElemType element) {
    if (i < 1 || i > L.length + 1 || L.length == MaxSize) {
        return false; // 插入位置无效或顺序表已满
    }
    for (int j = L.length; j >= i; j--) {
        L.data[j] = L.data[j - 1]; // 向后移动元素
    }
    L.data[i - 1] = element; // 插入新元素
    L.length++; // 更新顺序表长度
    return true; // 插入成功
}

删除元素 

ListDelete 函数用于删除顺序表中指定位置的元素。该函数首先检查删除位置的有效性,然后保存要删除的元素,并将后面的元素向前移动。

bool ListDelete(SqList &L, int i, ElemType &e) {
    if (i < 1 || i > L.length) {
        return false; // 删除位置无效
    }
    e = L.data[i - 1]; // 保存要删除的元素
    for (int j = i; j < L.length; j++) {
        L.data[j - 1] = L.data[j]; // 向前移动元素
    }
    L.length--; // 更新顺序表长度
    return true; // 删除成功
}

查找元素 

LocateElem 函数用于查找顺序表中指定元素的位置。如果找到该元素,返回其位置;否则返回 0。

int LocateElem(SqList &L, ElemType element) {
    for (int i = 0; i < L.length; i++) {
        if (element == L.data[i]) {
            return i + 1; // 返回顺序表的下标
        }
    }
    return 0; // 未找到元素
}

主函数

在主函数中,我们创建一个顺序表并进行一些操作,包括插入、删除和查找元素。

int main() {
    SqList L; // 定义顺序表 L
    bool ret; // 用于存储操作的返回值
    L.data[0] = 1; // 初始化顺序表
    L.data[1] = 2;
    L.data[2] = 3;
    L.length = 3; // 设置当前长度

    // 插入元素
    ret = ListInsert(L, 2, 4);
    if (ret) {
        printf("insert success\n");
        PrintList(L);
    } else {
        printf("insert failed\n");
    }

    // 删除元素
    ElemType del;
    ret = ListDelete(L, 1, del);
    if (ret) {
        printf("delete success\n");
        printf("deleted element: %d\n", del);
        PrintList(L);
    } else {
        printf("delete failed\n");
    }

    // 查找元素
    int pos = LocateElem(L, 60);
    if (pos) {
        printf("element found at position: %d\n", pos);
    } else {
        printf("element not found\n");
   

当然可以!接下来我们将继续完成博客的内容,涵盖主函数的剩余部分以及总结。

打印顺序表

为了方便查看顺序表中的元素,我们实现了一个 PrintList 函数。该函数遍历顺序表并打印出所有元素。

void PrintList(SqList L) {
    for (int i = 0; i < L.length; i++) {
        printf("%d ", L.data[i]); // 打印每个元素
    }
    printf("\n"); // 打印完毕后换行
}

完整代码

以下是完整的代码示例,包含了顺序表的定义、插入、删除、查找和打印操作:

#include <stdio.h>

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

typedef int ElemType; // 定义元素类型为整型

typedef struct {
    ElemType data[MaxSize]; // 存储元素的数组
    int length; // 当前顺序表的长度
} SqList;

bool ListInsert(SqList &L, int i, ElemType element) {
    if (i < 1 || i > L.length + 1 || L.length == MaxSize) {
        return false; // 插入位置无效或顺序表已满
    }
    for (int j = L.length; j >= i; j--) {
        L.data[j] = L.data[j - 1]; // 向后移动元素
    }
    L.data[i - 1] = element; // 插入新元素
    L.length++; // 更新顺序表长度
    return true; // 插入成功
}

void PrintList(SqList L) {
    for (int i = 0; i < L.length; i++) {
        printf("%d ", L.data[i]); // 打印每个元素
    }
    printf("\n"); // 打印完毕后换行
}

bool ListDelete(SqList &L, int i, ElemType &e) {
    if (i < 1 || i > L.length) {
        return false; // 删除位置无效
    }
    e = L.data[i - 1]; // 保存要删除的元素
    for (int j = i; j < L.length; j++) {
        L.data[j - 1] = L.data[j]; // 向前移动元素
    }
    L.length--; // 更新顺序表长度
    return true; // 删除成功
}

int LocateElem(SqList &L, ElemType element) {
    for (int i = 0; i < L.length; i++) {
        if (element == L.data[i]) {
            return i + 1; // 返回顺序表的下标
        }
    }
    return 0; // 未找到元素
}

int main() {
    SqList L; // 定义顺序表 L
    bool ret; // 用于存储操作的返回值
    L.data[0] = 1; // 初始化顺序表
    L.data[1] = 2;
    L.data[2] = 3;
    L.length = 3; // 设置当前长度

    // 插入元素
    ret = ListInsert(L, 2, 4);
    if (ret) {
        printf("insert success\n");
        PrintList(L);
    } else {
        printf("insert failed\n");
    }

    // 删除元素
    ElemType del;
    ret = ListDelete(L, 1, del);
    if (ret) {
        printf("delete success\n");
        printf("deleted element: %d\n", del);
        PrintList(L);
    } else {
        printf("delete failed\n");
    }

    // 查找元素
    int pos = LocateElem(L, 60);
    if (pos) {
        printf("element found at position: %d\n", pos);
    } else {
        printf("element not found\n");
    }

    return 0; // 程序结束
}

总结

在这篇博客中,我们实现了一个简单的顺序表,并提供了插入、删除、查找和打印元素的基本操作。顺序表是一种简单而有效的数据结构,适用于存储和管理线性数据。通过这些基本操作,我们可以更好地理解数据结构的工作原理。

希望这篇博客能帮助你更好地理解顺序表的实现和使用。如果你有任何问题或建议,请在评论区留言!


以上就是完整的博客内容。你可以根据自己的风格和需求进行调整和修改。希望这对你有帮助!

相关文章:

  • [vue] 缩放比适配问题
  • QT--事件系统
  • 智能合约安全指南 [特殊字符]️
  • 【音视频】封装格式与音视频同步
  • 六、Redis 高级功能详解:BitMap、HyperLogLog、Geo、Stream
  • 《用Python+PyGame开发双人生存游戏!源码解析+完整开发思路分享》
  • 【第13节】C++设计模式(行为模式)-Template(模板)模式
  • 【leetcode100】全排列
  • 【落羽的落羽 C++】C++入门基础:输入与输出,缺省参数,函数重载
  • FastGPT 源码:RRF、Rerank 相关代码
  • FastGPT 引申:基于 Python 版本实现 Java 版本 RRF
  • 源码编译安装httpd
  • 示例:在WPF中如何使用Segoe MDL2 Assets图标和使用该图标的好处
  • 算力100问☞第72问:算力与算法、数据的关系是什么?
  • JavaScript 变量命名规范
  • 自编码器——数据降维及特征提取
  • slf4j和log4j的区别与使用
  • Mysql从入门到精通day2————数据表操作
  • 第五十三:v-model修饰符
  • 深度学习之图像学习知识点
  • 自己怎么做网站网页/seo公司 杭州
  • 专业网站建设品牌策划方案/广告营销策划
  • 扬中网站建设包括哪些/吉安seo招聘
  • 做外汇新闻网站/太原优化排名推广
  • 网站后台添加查看爬虫的痕迹/网红推广
  • 工信部网站手机备案查询/推广方案格式模板范文