C语言深入浅出讲解顺序表的实现

C语言深入浅出讲解顺序表的实现

顺序表简介

顺序表是一种线性表的存储结构,它是由连续的内存空间来存储线性表中的元素。

顺序表的特点是支持查找、插入和删除操作,操作效率较高,但需要提前分配足够大的内存空间。当顺序表空间不足时,需要扩容,移动数据较为麻烦。

顺序表的实现

数据结构定义

顺序表的数据结构定义包含以下几个成员:

  • 数据元素数组 data,存储线性表中的元素
  • 当前线性表中的元素个数 length
  • 顺序表中容纳的元素个数 size
#define MAX_SIZE 100 // 定义最大容纳元素个数

typedef struct SqList {
    int data[MAX_SIZE];
    int length;
    int size;
} SqList;

初始化顺序表

初始化一个空的顺序表,需要将元素个数 length 置为 0,容纳元素的个数 size 置为指定的容量 max_size

void init(SqList *list, int max_size) {
    list->length = 0;
    list->size = max_size;
}

插入元素

向顺序表中插入一个元素,需要将该元素插入到指定的位置,并将该位置后的元素向后移动一位。

bool insert(SqList *list, int index, int value) {
    if (list->length >= list->size) {
        return false;
    }
    if (index < 0 || index > list->length) {
        return false;
    }
    // 从末尾向指定位置移动元素
    for (int i = list->length - 1; i >= index; i--) {
        list->data[i + 1] = list->data[i];
    }
    // 在指定位置插入元素
    list->data[index] = value;
    list->length++;
    return true;
}

删除元素

从顺序表中删除一个元素,需要将该位置后的元素向前移动一位。

bool remove(SqList *list, int index) {
    if (index < 0 || index >= list->length) {
        return false;
    }
    // 从指定位置向后移动元素
    for (int i = index; i < list->length - 1; i++) {
        list->data[i] = list->data[i + 1];
    }
    list->length--;
    return true;
}

查找元素

在顺序表中查找指定元素时,需要遍历所有元素逐个比较。

int find(SqList *list, int value) {
    for (int i = 0; i < list->length; i++) {
        if (list->data[i] == value) {
            return i;
        }
    }
    return -1;
}

示例说明

示例一:插入元素

#include <stdio.h>
#include <stdbool.h>

#define MAX_SIZE 100

typedef struct SqList {
    int data[MAX_SIZE];
    int length;
    int size;
} SqList;

void init(SqList *list, int max_size) {
    list->length = 0;
    list->size = max_size;
}

bool insert(SqList *list, int index, int value) {
    if (list->length >= list->size) {
        return false;
    }
    if (index < 0 || index > list->length) {
        return false;
    }
    // 从末尾向指定位置移动元素
    for (int i = list->length - 1; i >= index; i--) {
        list->data[i + 1] = list->data[i];
    }
    // 在指定位置插入元素
    list->data[index] = value;
    list->length++;
    return true;
}

int main() {
    SqList list;
    int value = 3;
    init(&list, MAX_SIZE);
    insert(&list, 0, 1);
    insert(&list, 1, 2);
    insert(&list, 2, value);
    for (int i = 0; i < list.length; i++) {
        printf("%d ", list.data[i]);
    }
    printf("\n");
    return 0;
}

输出结果:

1 2 3

示例二:删除元素

#include <stdio.h>
#include <stdbool.h>

#define MAX_SIZE 100

typedef struct SqList {
    int data[MAX_SIZE];
    int length;
    int size;
} SqList;

void init(SqList *list, int max_size) {
    list->length = 0;
    list->size = max_size;
}

bool remove(SqList *list, int index) {
    if (index < 0 || index >= list->length) {
        return false;
    }
    // 从指定位置向后移动元素
    for (int i = index; i < list->length - 1; i++) {
        list->data[i] = list->data[i + 1];
    }
    list->length--;
    return true;
}

int main() {
    SqList list;
    init(&list, MAX_SIZE);
    insert(&list, 0, 1);
    insert(&list, 1, 2);
    insert(&list, 2, 3);
    remove(&list, 1);
    for (int i = 0; i < list.length; i++) {
        printf("%d ", list.data[i]);
    }
    printf("\n");
    return 0;
}

输出结果:

1 3

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言深入浅出讲解顺序表的实现 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • 【ACM算法竞赛日常训练】DAY3题解与分析【旅游】【tokitsukaze and Soldier】

    DAY3共2题: 旅游 tokitsukaze and Soldier ? 作者:Eriktse? 简介:19岁,211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)?? 原文链接(阅读原文获得更好阅读体验): 旅游 题目传送门:https://ac.nowcoder…

    算法与数据结构 2023年4月18日
    00
  • C语言线性表顺序存储结构实例详解

    C语言线性表顺序存储结构实例详解 线性表的定义 线性表是数据结构中最基本的结构之一。它们是由相同数据类型的一组数据元素组成的序列。线性表具有唯一的首元素和唯一的末元素,除第一个元素之外的每个元素都有唯一的前继,除最后一个元素之外的每个元素都有唯一的后继。 线性表的存储方式 线性表有两种存储方式: 顺序存储和链式存储。 顺序存储采用一段连续的内存空间来存储线性…

    数据结构 2023年5月17日
    00
  • 一、对系统理论的认识

           经过一周的时间学习,我们知道了系统的定义:是一个由一组相互连接的要素构成的,能够实现某个目标的整体,任何一个系统都包括三种构成要件:要素连接,功能或目标。       1.系统的连接使得系统呈现特定的结构,使得系统的各个部件连接而产生系统特有的功能—相关性导新功能涌现。连接的媒介—“三流”(信息流,能量流,物质流)。       2.系统的静态…

    算法与数据结构 2023年4月18日
    00
  • redis数据结构之intset的实例详解

    Redis数据结构之intset的实例详解 介绍 Redis是一个高性能的key-value存储系统,支持多种数据结构。其中,intset是Redis内置的一种特殊的数据结构,它可以高效地存储整型数据。 本篇文章将介绍intset的基本特性、底层实现以及相关用例,以便读者能够更好地了解该数据结构在Redis中的应用。 intset的基本特性 intset是一…

    数据结构 2023年5月17日
    00
  • 使用go实现常见的数据结构

    下面我将详细讲解使用go实现常见的数据结构的完整攻略。 1. 概述 数据结构是计算机程序设计中一个非常重要的概念,常见的有数组、链表、栈、队列、树、图等。本文主要介绍如何使用Go实现常见的数据结构。 2. 数组 数组是最简单、最基本的数据结构之一,它在Go中的实现非常简单,可以用以下代码片段表示: // 定义一个长度为10的整型数组 var arr [10]…

    数据结构 2023年5月17日
    00
  • C++数据结构与算法之判断一个链表是否为回文结构的方法

    当我们遇到判断一个链表是否为回文结构的问题时,可以考虑使用如下的方法: 遍历链表,将链表节点的值存储到一个数组或者栈中。 遍历链表,将链表节点的值与前面存储的值进行比较,如果全部相同,则证明链表为回文结构。 下面是详细的代码实现和示例说明: 实现 首先,我们需要定义一个链表节点的结构体,包括节点值和指向下一个节点的指针: struct ListNode { …

    数据结构 2023年5月17日
    00
  • JavaScript数据结构与算法之二叉树遍历算法详解【先序、中序、后序】

    JavaScript数据结构与算法之二叉树遍历算法详解 什么是二叉树 二叉树是一种每个节点最多只有两个子节点的树结构,可以用来组织数据、搜索、排序等。 二叉树的遍历 遍历是指按照一定次序访问二叉树中的所有节点。常见的二叉树遍历有三种方式:先序遍历、中序遍历、后序遍历。以下分别对它们进行详细讲解。 前序遍历 前序遍历是指先访问节点本身,然后再遍历其左子树和右子…

    数据结构 2023年5月17日
    00
  • 第14届蓝桥杯C++B组省赛题解(A-J)(更新完毕)

    目录 A. 日期统计 题目内容 思路 代码 答案 B.01 串的熵 题目内容 思路 代码 答案 C.冶炼金属 题目内容 输入格式 输出格式 输入样例 输出样例 思路 代码 D.飞机降落 题目内容 输入格式 输出格式 输入样例 输出样例 思路 代码 E.接龙数列 题目内容 输入格式 输出格式 输入样例 输出样例 思路 代码 F.岛屿数量 题目内容 输入格式 输…

    算法与数据结构 2023年4月25日
    00
合作推广
合作推广
分享本页
返回顶部