【数据结构】顺序表


线性表:( linear list)是n个 具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表: 顺序表、链表、栈、队列、字符串...

线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储

在这里插入图片描述

什么是顺序表

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构一般情况下采用数组存储。在数组上完成数据的增删查改。

  • 静态顺序表:使用定长数组存储元素

在这里插入图片描述

  • 动态顺序表:使用动态开辟的数组存储

在这里插入图片描述

顺序表代码实现

静态顺序表只适用于确定知道需要存多少数据的场景。静态顺序表的定长数组导致N定大了,空间开多了浪费,开少了不够用。所以现实中基本都是使用动态顺序表,根据需要动态的分配空间大小,所以下面我们实现动态顺序表

  • SeqList.hpp
#pragma once
#include <iostream>
#include <cassert>

namespace ns_Seq{
    template <class T>
    class SeqList{
    private:
        T* arr;
        int size;
        int capacity;

    public:
        SeqList()
        :arr(nullptr)
        ,size(0)
        ,capacity(0)
        {}

    private:

        //检查空间,如果满了,进行增容
        void CheckCapacity(){
            if(size >= capacity){
                //看空间大小是否是0
                T newCapacity = capacity == 0 ? 4 : 2 * capacity;
                //开辟新空间
                T* newArr = new T[newCapacity];

                //把数据拷贝到新空间
                if (arr) {
                    for (int i = 0; i < size; ++i) {
                        newArr[i] = arr[i];
                    }
                }

                //释放原来空间
                delete [] arr;
                //arr指向新空间
                arr = newArr ;
                //更新capacity
                capacity = newCapacity;
            }
        }

    public:
        //顺序表在pos位置插入x
        void insert(size_t pos,const T& val){
            //检查容量
            CheckCapacity();
            assert(pos >= 0 && pos <= size);
            //挪动数据,pos位置后的数据统一后移一位
            for (int i = size; i > pos; --i) {
                arr[i] = arr[i - 1];
            }

            arr[pos] = val;
            size++;
        }

        // 顺序表删除pos位置的值
        void erase(size_t pos){
            assert(pos >= 0 && pos <= size);
            assert(size > 0);//保证顺序表不为空

            //挪动数据,pos位置后的数据统一前移一位
            for(int i = pos; i < size-1; ++i){
                arr[i] = arr[i+1];
            }

            //更新size
            size--;
        }


        //顺序表尾插
        void push_back(const T& val){
            insert(size,val);
        }
        //顺序表尾删
        void pop_back(){
            erase(size);
        }

        //顺序表头插
        void push_front(const T& val){
            insert(0,val);
        }
        //顺序表头删
        void pop_front(){
            erase(0);
        }


        //顺序表查找
        int find(const T& val){
            for(int i = 0; i < size; ++i){
                if(arr[i] == val){
                    return i;
                }
            }
            return -1;
        }
        //顺序表打印
        void printSeq(){
            for(int i = 0; i < size; i++){
                std::cout<< arr[i] << " ";
            }
            std::cout<<std::endl;
        }

    public:
        ~SeqList(){
            delete [] arr;
            size = 0;
            capacity = 0;
        }
    };
}

顺序表问题

  • 中间/头部插入删除时间复杂度O(N)
  • 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。
  • 增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到200,我们再继续插入了5个数据,后面没有数据插入了,那么就浪费了95个数据空间
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
顺序表是一种常见的数据结构,用于存储一组具有相同类型的元素。它的基本操作包括创建、查找、插入和删除等。 在C语言中,可以通过使用数组来实现顺序表。我们可以定义一个数组来存储顺序表的元素,然后通过索引来访问和操作其中的元素。引用中的代码展示了一个简单的顺序表的例子,它使用了C语言来实现。在这个例子中,我们可以看到如何创建一个顺序表、插入元素、删除元素以及查找元素的前驱和后继。 引用中的代码是一个测试顺序表基本操作的例子。它使用了一个自定义的List类来实现顺序表,并对其进行了各种操作,包括插入元素、删除元素、查找元素的前驱和后继以及遍历整个顺序表顺序表的结构体定义可以根据具体的需求进行定义。在引用中的代码中,定义了一个结构体ConnTimeout,其中包含了一个int类型的fd和一个time_t类型的timeout成员变量。这个结构体可以用来表示连接超时的信息。 总而言之,顺序表是一种常见的数据结构,可以通过使用数组来实现。在C语言中,可以使用数组和相关的操作来创建、查找、插入和删除顺序表中的元素。结构体的定义可以根据具体的需求进行自定义。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [数据结构顺序表c++代码](https://download.csdn.net/download/qq_46546083/13458006)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [C++数据结构顺序表(模板类实现)](https://blog.csdn.net/sagjhdj/article/details/123260460)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [【数据结构顺序表(C++)](https://blog.csdn.net/qq_51604330/article/details/120600041)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaomage1213888

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值