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日

相关文章

  • C语言数据结构之模式匹配字符串定位问题

    C语言数据结构之模式匹配字符串定位问题 什么是模式匹配字符串定位? 模式匹配字符串定位即在一个文本串中匹配一个模式串,并且返回模式串在文本串中第一次出现的位置。 例如,对于文本串“this is a test string”,我们想要匹配模式串“test”,我们期望得到的结果是第一次出现的位置为10。 KMP算法 算法思路 KMP算法是一种高效的字符串匹配算…

    数据结构 2023年5月16日
    00
  • NDK 数据结构之队列与栈等的实现

    NDK 数据结构之队列与栈等的实现 引言 Android NDK 是 Android 开发工具包的一部分,可以用 C 和 C++ 编写应用程序和库。NDK 带来了许多好处,例如可以针对不同的平台进行优化,可以通过调用底层 C/C++ 库实现更高效的算法等。 在本篇文档中,我们将探讨如何使用 NDK 实现一些基础的数据结构,包括队列、栈等等。 队列的实现 队列…

    数据结构 2023年5月17日
    00
  • 浅谈iOS 数据结构之链表

    浅谈iOS 数据结构之链表 在计算机科学中,链表是一种数据结构,用于存储一系列按顺序排列的元素。链表的一个关键点是它不需要连续的内存空间来存储元素,相反,每个元素由一个指向下一个元素的指针组成。在iOS开发中,链表在各种场景下都有所应用,如UITableView和UICollectionView的数据源等。本文将详细讲解链表的基本知识和使用技巧。 链表的基本…

    数据结构 2023年5月17日
    00
  • java数据结构基础:线性表

    Java数据结构基础:线性表 简介 线性表是指数据元素之间存在线性关系的数据结构,即数据元素之间有前后直接关系,且第一个元素没有前驱,最后一个元素没有后继。线性表可以用数组或者链表两种方式实现。 数组实现线性表 线性表的数组实现即为将线性表中的元素放在一个一维数组中,使用数组下标表示元素的位置。由于数组随机访问元素的时间复杂度为O(1),因此在随机访问比较多…

    数据结构 2023年5月17日
    00
  • python数据结构之二叉树的建立实例

    下面是Python数据结构之二叉树的建立实例的完整攻略。 一、二叉树的概念 二叉树是一种常用的树形结构,它由一组父子关系组成,其中每个节点都最多有两个子节点。通常我们认为,一个二叉树的根节点是唯一的,它没有父节点,而叶子节点则没有子节点。在二叉树中,节点的左子树和右子树可以为空。 二、二叉树的遍历 二叉树的遍历是指访问二叉树中所有节点的操作,它分为三种不同的…

    数据结构 2023年5月17日
    00
  • Java红黑树的数据结构与算法解析

    Java红黑树的数据结构与算法解析 红黑树简介 红黑树是一种平衡二叉搜索树,其中的每个节点上都有一个黑色或红色的标记,并且满足以下性质: 根节点是黑色的; 叶子节点是黑色的空节点(NULL); 如果一个节点是红色的,则其子节点必须是黑色的; 从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点; 新插入的节点默认是红色的。 具体来说,只有在删除或者某…

    数据结构 2023年5月17日
    00
  • Java 超详细图解集合框架的数据结构

    下面是完整攻略: Java 超详细图解集合框架的数据结构 简介 集合框架是Java中最基础的数据结构之一,是大部分Java程序员必须掌握的基础知识。这个框架提供了常用的数据结构和算法,包括List、Set、Map等等。本文将带领您从数据结构的角度详细解析Java集合框架中的各种数据结构,让您能够清晰地掌握它们的特点和使用方法。 数据结构 Java集合框架中的…

    数据结构 2023年5月17日
    00
  • 腾讯2018秋招正式笔试题目小结

    腾讯2018秋招正式笔试题目小结 背景介绍 腾讯作为中国科技领域的佼佼者,每年都会举行大规模的招聘,吸引着众多优秀的应聘者前来。其中,笔试是选拔过程中的重要环节,也是一个入职的关键。本文旨在对腾讯2018秋招正式笔试的题目进行详细的分析和总结,帮助广大应聘者更好地进行准备。 题目类型 腾讯2018秋招正式笔试共分为两个部分:编程题和客观题。编程题主要考察应聘…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部