C++实现数据结构的顺序表详解

C++实现数据结构的顺序表详解

介绍

在进行程序开发时,常常需要对数据进行存储和操作。其中一种数据结构是顺序表,它提供了一种在内存中线性存储数据的方法,能够方便地对数据进行插入、删除、查找等操作。本文将详细介绍如何使用C++实现数据结构的顺序表,帮助读者掌握顺序表的创建、插入、删除、查找等操作。

创建顺序表

顺序表可以使用数组来实现。下面的代码展示了如何创建一个长度为10的顺序表,其中元素类型为整型:

#define MAX_SIZE 10

class SeqList {
public:
    SeqList() {
        m_size = 0;
    }

    void insert(int pos, int value) {
        //确保插入位置合法
        if (pos < 0 || pos > m_size) {
            return;
        }

        //如果列表已满,则无法插入新的元素
        if (m_size == MAX_SIZE) {
            return;
        }

        //将插入位置及之后的元素向后移动一位
        for (int i = m_size; i > pos; --i) {
            m_data[i] = m_data[i-1];
        }

        //在插入位置处插入新的元素
        m_data[pos] = value;

        //更新列表长度
        ++m_size;
    }

    void remove(int pos) {
        //确保删除位置合法
        if (pos < 0 || pos >= m_size) {
            return;
        }

        //将删除位置之后的元素向前移动一位
        for (int i = pos + 1; i < m_size; ++i) {
            m_data[i-1] = m_data[i];
        }

        //更新列表长度
        --m_size;
    }

    int find(int value) {
        for (int i = 0; i < m_size; ++i) {
            if (m_data[i] == value) {
                //返回元素在列表中的位置
                return i;
            }
        }

        //如果没有找到该元素,则返回-1
        return -1;
    }

private:
    int m_data[MAX_SIZE];
    int m_size;
};

插入和删除元素

在顺序表中插入和删除元素的操作比较简单。当需要在顺序表的pos位置插入新元素value时,应将pos及之后的元素都向后移动一位,然后在pos处插入新元素。删除元素pos时,应将pos之后的元素都向前移动一位。

例如,如果想在下面这个列表中插入元素3:

1, 2, 4, 5, 6

则应将4, 5, 6向后移动一位,变成:

1, 2, 4, 5, 5, 6

然后在空出的位置2处插入新元素3,得到:

1, 2, 3, 4, 5, 6

如果要删除元素4,则应将5和6向前移动一位,得到:

1, 2, 5, 6

查找元素

查找元素在顺序表中的位置的操作也比较简单,只需要遍历整个列表,逐个比较每个元素是否等于待查找的元素值。

例如,如果要查找下面这个列表中元素5的位置:

1, 2, 3, 4, 5, 6

则需要逐个比较每个元素是否等于5,直到找到对应位置,即4。

示例

下面展示两个完整的示例,演示如何使用C++编写顺序表的相关操作。

示例1:插入和删除元素

下面的代码演示如何创建一个长度为5的顺序表,并在其中插入和删除元素:

#include <iostream>

using namespace std;

#define MAX_SIZE 5

class SeqList {
public:
    SeqList() {
        m_size = 0;
    }

    void insert(int pos, int value) {
        //确保插入位置合法
        if (pos < 0 || pos > m_size) {
            return;
        }

        //如果列表已满,则无法插入新的元素
        if (m_size == MAX_SIZE) {
            return;
        }

        //将插入位置及之后的元素向后移动一位
        for (int i = m_size; i > pos; --i) {
            m_data[i] = m_data[i-1];
        }

        //在插入位置处插入新的元素
        m_data[pos] = value;

        //更新列表长度
        ++m_size;
    }

    void remove(int pos) {
        //确保删除位置合法
        if (pos < 0 || pos >= m_size) {
            return;
        }

        //将删除位置之后的元素向前移动一位
        for (int i = pos + 1; i < m_size; ++i) {
            m_data[i-1] = m_data[i];
        }

        //更新列表长度
        --m_size;
    }

    int find(int value) {
        for (int i = 0; i < m_size; ++i) {
            if (m_data[i] == value) {
                //返回元素在列表中的位置
                return i;
            }
        }

        //如果没有找到该元素,则返回-1
        return -1;
    }

private:
    int m_data[MAX_SIZE];
    int m_size;
};

int main() {
    SeqList list;

    //插入元素1和2
    list.insert(0, 1);
    list.insert(1, 2);

    //打印当前列表
    cout << "当前列表:";
    for (int i = 0; i < list.size(); ++i) {
        cout << list[i] << " ";
    }
    cout << endl;

    //插入元素3
    list.insert(1, 3);

    //打印当前列表
    cout << "当前列表:";
    for (int i = 0; i < list.size(); ++i) {
        cout << list[i] << " ";
    }
    cout << endl;

    //删除元素1
    list.remove(0);

    //打印当前列表
    cout << "当前列表:";
    for (int i = 0; i < list.size(); ++i) {
        cout << list[i] << " ";
    }
    cout << endl;

    return 0;
}

输出结果为:

当前列表:1 2 
当前列表:1 3 2 
当前列表:3 2

示例2:查找元素

下面的代码演示如何创建一个长度为10的顺序表,并在其中查找元素:

#include <iostream>

using namespace std;

#define MAX_SIZE 10

class SeqList {
public:
    SeqList() {
        m_size = 0;
    }

    void insert(int pos, int value) {
        //确保插入位置合法
        if (pos < 0 || pos > m_size) {
            return;
        }

        //如果列表已满,则无法插入新的元素
        if (m_size == MAX_SIZE) {
            return;
        }

        //将插入位置及之后的元素向后移动一位
        for (int i = m_size; i > pos; --i) {
            m_data[i] = m_data[i-1];
        }

        //在插入位置处插入新的元素
        m_data[pos] = value;

        //更新列表长度
        ++m_size;
    }

    void remove(int pos) {
        //确保删除位置合法
        if (pos < 0 || pos >= m_size) {
            return;
        }

        //将删除位置之后的元素向前移动一位
        for (int i = pos + 1; i < m_size; ++i) {
            m_data[i-1] = m_data[i];
        }

        //更新列表长度
        --m_size;
    }

    int find(int value) {
        for (int i = 0; i < m_size; ++i) {
            if (m_data[i] == value) {
                //返回元素在列表中的位置
                return i;
            }
        }

        //如果没有找到该元素,则返回-1
        return -1;
    }

private:
    int m_data[MAX_SIZE];
    int m_size;
};

int main() {
    SeqList list;

    //插入元素1到10
    for (int i = 1; i <= 10; ++i) {
        list.insert(i-1, i);
    }

    //查找元素7
    int pos = list.find(7);

    if (pos == -1) {
        cout << "没有找到元素7" << endl;
    } else {
        cout << "元素7的位置为:" << pos << endl;
    }

    return 0;
}

输出结果为:

元素7的位置为:6

总结

本文介绍了如何使用C++实现数据结构的顺序表。创建顺序表可以使用数组来实现,然后可以实现插入、删除、查找等操作。代码示例演示了如何实现插入、删除、查找操作,并且提供了两个完整的示例,帮助读者理解顺序表的操作。顺序表是一种比较简单但实用的数据结构,掌握其原理和使用方法有助于提升编程技能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++实现数据结构的顺序表详解 - Python技术站

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

相关文章

  • 数据结构 双向链表的创建和读取详解及实例代码

    下面我为你详细讲解“数据结构 双向链表的创建和读取详解及实例代码”的完整攻略。 什么是双向链表? 双向链表是一种常见的线性数据结构,与单向链表相比,它可以在节点之间建立双向连接,使得在需要反向遍历链表时效率更高。每个节点同时保存了指向前一个节点和后一个节点的指针,因此双向链表也叫做双链表。 双向链表的创建 定义节点类 首先,我们需要定义一个表示节点的类,该类…

    数据结构 2023年5月16日
    00
  • 数据结构之位图(bitmap)详解

    数据结构之位图(bitmap)详解 什么是位图? 位图,又称为比特图、Bitmap,是一种非常常用的数据结构。它是一种特殊的数组,只能存储0或1,可以用来表示一些二元状态,如二进制码、字符集、颜色等信息。在数据挖掘、工程设计、网络安全等领域都有广泛的应用。 位图的原理 位图的原理是用数据的位来表示某个元素对应的值。如果对应位为1,则代表该元素存在,否则代表该…

    数据结构 2023年5月17日
    00
  • C语言数据结构之模式匹配字符串定位问题

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

    数据结构 2023年5月16日
    00
  • Python中的函数式编程:不可变的数据结构

    Python是一门支持函数式编程的语言。相比于传统的命令式编程,函数式编程更加强调数据的不可变性。本文将介绍如何在Python中使用不可变的数据结构实现函数式编程。 什么是不可变的数据结构? 不可变数据结构是指一旦创建就无法改变的数据结构。在Python中,元组(tuple)是一个典型的不可变数据结构。以下是一个创建元组的示例代码: a_tuple = (1…

    数据结构 2023年5月17日
    00
  • 数据结构与算法中二叉树子结构的详解

    数据结构与算法中二叉树子结构的详解 什么是二叉树子结构 二叉树是一种数据结构,由包含根节点的节点组成,可以拓展为左子树和右子树。二叉树子结构指的是,在一棵二叉树中,具有连续节点的子树。 如何判断是否为二叉树子结构 对于一棵二叉树T和另外一棵二叉树S,我们可以判断S是否为T的子树,遵循以下判断原则: 如果树S为空,则表示S不是T的子树; 如果树S的根节点和树T…

    数据结构 2023年5月17日
    00
  • 使用C语言构建基本的二叉树数据结构

    下面是使用C语言构建二叉树数据结构的步骤和示例: 1. 定义二叉树结构体类型 定义一个二叉树的结构体,包含节点值、左右子节点等信息: typedef struct TreeNode { int val; struct TreeNode* left; struct TreeNode* right; } TreeNode; 2. 实现创建二叉树的函数 实现一个函…

    数据结构 2023年5月17日
    00
  • 一些常见的字符串匹配算法

    作者:京东零售 李文涛 一、简介 1.1 Background 字符串匹配在文本处理的广泛领域中是一个非常重要的主题。字符串匹配包括在文本中找到一个,或者更一般地说,所有字符串(通常来讲称其为模式)的出现。该模式表示为p=p[0..m-1];它的长度等于m。文本表示为t=t[0..n-1],它的长度等于n。两个字符串都建立在一个有限的字符集上。 一个比较常见…

    算法与数据结构 2023年4月25日
    00
  • MySQL索引原理详解

    MySQL索引原理详解 MySQL索引是一种数据结构,用于帮助查询语句更快地访问到所需的数据,提高数据库查询效率。本文将详细讲解MySQL索引的原理、类型及如何创建索引。 索引原理 B树 MySQL索引底层数据结构主要采用B树,B树是一种多路平衡查找树。B树的每一个节点可以存储多个键值,每个节点的子节点个数也可以大于2,从而使得查询效率更高。 索引分类 My…

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