线性表

作者: Houzhuo | 来源:发表于2016-08-16 18:52 被阅读11次

线性表是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;
}

引用:计蒜客

相关文章

  • 线性表的相关操作

    集合 --- 创建线性表 解散 --- 销毁线性表 长度 --- 得到线性表的长度 出列 --- 从线性表删除一个...

  • [数据结构]第二章线性表(1)——线性表

    线性表 线性表的基本概念 线性表的定义 线性表是具有相同数据类型的n(n>=0)个元素的有限序列。 线性表的基本操...

  • 数据结构与算法(二)

    线性表及其顺序存储结构 线性表的基本概念 线性结构又称为线性表,线性表是最简单也是最常用的一种数据结构。 线性表的...

  • 线性表及应用

    线性表 “线性表(List):零个或多个数据元素的有限序列。” 线性表的顺序存储结构 线性表的顺序存储结构,指的是...

  • 数据结构03-线性表之顺序表

    第三章 线性表之顺序表 第三章 线性表之顺序表一、什么是线性表?1> 概念2> 线性表的基本操作二、线性表的顺序存...

  • 数据结构之线性表

    1、线性表-顺序表线性表-顺序表

  • 线性表数据结构

    线性表 线性表就是数据排成像一条线的结构,每个线性表上的数据最多只有前和后两个方向。与线性表对立的是非线性表,如二...

  • 大话数据结构 - 线性表

    代码GitHub地址 线性表 线性表需要相同的数据类型 线性表的处理方式都是先取代,后目的。比如删除链式线性表的某...

  • 数据结构-线性表(顺序表和链表)

    大纲:理解线性表的逻辑结构掌握线性表的顺序存贮结构和链式存贮结构;掌握线性表基本操作的实现。了解线性表的应用。 线...

  • 数据结构 线性表 单链表 c语言实现可运行

    线性表 线性表概念 线性表定义:具有相同特性数据元素的有限序列。线性表的逻辑结构:线性结构。只有一个表头,只有一个...

网友评论

      本文标题:线性表

      本文链接:https://www.haomeiwen.com/subject/fijusttx.html