线性表

线性表是n个相同数据类型的元素组成的有限序列。
线性表按照存储结构可分为顺序表和链表。
顺序表都是内存地址连续的元素组成的!

顺序表的构建

  • 定义元素个数和顺序表最大容量,初始化指针
  • 在构造函数中传参来确定size;length设为0;初始化指针地址。
#include <iostream>
#include <cstring>
using namespace std;
class Vector {
private:
    int size, length;
    int *data;
public:
    Vector(int input_size) {
        size = input_size;
        length = 0;
        data = new int[size];
    }
    ~Vector() {
        delete[] data;   // 析构函数中进行删除
    }
};
int main() {
    Vector a(2);
    return 0;
}

顺序表的插入:

在insert方法中定义了参数loc,value。loc为插入的位置,value代表插入的数值。每次插入都要将序列loc之后的元素向后移动一位,并且长度length增加1。成功返回true,否则false。

  • 判断loc位置是否合法。位于0到length之间(包括length),有元素在序列上才可以进行插入,所以开始为空时要顺序插入。并且元素左右两边都可插入(所以位置为length时依然合法)。
  • 判断元素个数是否超出最大容量(长度相等时就不能插入了,再插溢出)。
  • 将loc(包括loc)之后的元素右移
  • 插入赋值
  • 元素个数加1
在构造函数中添加insert方法
    bool insert(int loc, int value) {
        if(loc < 0 || loc > length){
        return false;
        }
        if (length >= size){
        return false;
        }
        
        for (int i = length; i > loc; i--){
            data[i] = data[i-1];
        }
        data[loc] = value;
        length += 1;
        return true;
    }

顺序表的扩容:

通产来说,扩容通常是将容量修改为以前的两倍;扩容时要重新开辟一块空间并把原有数据 依次 拷贝过去,再将原来的 空间 释放

  • 保存原始数据到旧指针
  • 容量加倍
  • 指针指向新size开辟的新空间
  • 数据拷贝
  • 在insert中调用 回收
    bool insert(int loc, int value) {
        if (loc < 0 || loc > length) {
            return false;
        }
        if (length >= size) {
            //return false;
            expand();
        }
        for (int i = length; i > loc; --i) {
            data[i] = data[i - 1];
        }
        data[loc] = value;
        length++;
        return true;
    }
    void expand(){
        int *old_data = data
        size = size * 2;
        data = new int[size] ;
        
        for(int i = 0; i <length;i ++){
            data[i] = old_data[i];
       
    }
        delete[] old_data;
    }

顺序表的查找

接收一个int类型的value,返回该值对应的下表,没有返回-1

从零循环到小于length,枚举匹配:
int search(int value) {
        for(int i=0; i < length; i++){
            if (data[i] == value){
                return i
            }
        }
        return -1;
    }

顺序表的删除:index之后的元素向前移动一位。

  • 判断index是否在元素中
  • index之后的元素向前移
  • 元素个素减1,返回true
bool remove(int index) {
        if(index < 0 || index >= length){
            return false
        }
        for(int i = index + 1; i < length; i++){
            data[i-1] = data[i];
        }
        length -= 1;
        return true;
    }

顺序表的遍历

把顺序表的所有元素输出到一行,并用空格分开。

  • 判断第一个元素,不要输出空格
  • 循坏遍历输出
void print() {
        for(int i = 0; i<length; i++){
            if(i > 0){
                cout << " ";
            }
            cout << data[i];
        }
        cout << endl; //输出空行
    }

完整代码:

#include <iostream>
#include <cstring>
using namespace std;
class Vector {
private:
    int size, length;
    int *data;
public:
    Vector(int input_size) {
        size = input_size;
        length = 0;
        data = new int[size];
    }
    ~Vector() {
        delete[] data;
    }
    bool insert(int loc, int value) {
        if (loc < 0 || loc > length) {
            return false;
        }
        if (length >= size) {
            return false;
        }
        for (int i = length; i > loc; --i) {
            data[i] = data[i - 1];
        }
        data[loc] = value;
        length++;
        return true;
    }
    int search(int value) {
        for (int i = 0; i < length; ++i) {
            if (data[i] == value) {
                return i;
            }
        }
        return -1;
    }
    bool remove(int index) {
        if (index < 0 || index >= length) {
            return false;
        }
        for (int i = index + 1; i < length; ++i) {
            data[i - 1] = data[i];
        }
        length = length - 1;
        return true;
    }
    void print() {
        for(int i = 0; i<length; i++){
            if(i > 0){
                cout << " ";
            }
            cout << data[i];
        }
        cout << endl
    }
};
int main() {
    Vector a(2);
    cout << a.insert(0, 1) << endl;
    cout << a.insert(0, 2) << endl;
    a.print();
    cout << a.remove(1) << endl;
    a.print();
    cout << a.search(0) << endl;
    cout << a.search(1) << endl;
    return 0;
}

引用:计蒜客

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1.线性表的定义 线性表:零个或多个数据元素的有限序列序列:也就是说元素之间是有顺序的,若元素存在多个,则第一个元...
    e40c669177be阅读 6,370评论 6 15
  • 从数据的逻辑结构来分,数据元素之间存在的关联关系被称为数据的逻辑结构。归纳起来,应用程序中的数据大致哟如下四种基本...
    Jack921阅读 4,645评论 0 2
  • 一、定义: 线性表是具有像线一样的性质的表,是一个序列,元素间是有顺序的,如果存在多个元素的话,第一个元素无前驱,...
    nuclear阅读 4,842评论 1 0
  • 一.线性表 定义:零个或者多个元素的有限序列。也就是说它得满足以下几个条件:  ①该序列的数据元素是有限的。  ②...
    Geeks_Liu阅读 7,579评论 1 12
  • 3.2 线性表的定义 线性表,从名字上你就能感觉到,是具有像线一样的性质的表。 零个或多个数据元素的有限序列。 这...
    努力生活的西鱼阅读 4,522评论 0 1

友情链接更多精彩内容