首页 > 编程语言 >c++ day 12

c++ day 12

时间:2023-07-19 21:47:58浏览次数:38  
标签:12 线性表 int list c++ LinearList length data day

前几天一直在修改八字循环的包 今天和控制接了一下,可以输出转角和速度,希望到时候实车的时候可以一步到位吧。

今天开始整数据结构。

先来理解线性表

线性表(英语:Linear List)是由n(n≥0)个数据元素(结点)a[0],a[1],a[2]…,a[n-1]组成的有限序列

其中:

  • 数据元素的个数n定义为表的长度 = "list".length() ("list".length() = 0(表里没有一个元素)时称为空表)
  • 将非空的线性表(n>=1)记作:(a[0],a[1],a[2],…,a[n-1])
  • 数据元素a[i](0≤i≤n-1)只是个抽象符号,其具体含义在不同情况下可以不同

一个数据元素可以由若干个数据项组成。数据元素称为记录,含有大量记录的线性表又称为文件。这种结构具有下列特点:存在一个唯一的没有前驱的(头)数据元素;存在一个唯一的没有后继的(尾)数据元素;此外,每一个数据元素均有一个直接前驱和一个直接后继数据元素。   

下面我将使用c和c++来实现一个线性表

C语言实现线性表:

 

#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 100

typedef struct {
    int data[MAX_SIZE];
    int length;
} LinearList;

void initList(LinearList *list) {
    list->length = 0;
}

int isEmpty(LinearList *list) {
    return (list->length == 0);
}

int isFull(LinearList *list) {
    return (list->length == MAX_SIZE);
}

void insert(LinearList *list, int element, int position) {
    if (position < 1 || position > list->length + 1) {
        printf("Invalid position\n");
        return;
    }
    if (isFull(list)) {
        printf("List is full\n");
        return;
    }
    for (int i = list->length - 1; i >= position - 1; i--) {
        list->data[i + 1] = list->data[i];
    }
    list->data[position - 1] = element;
    list->length++;
}

void display(LinearList *list) {
    if (isEmpty(list)) {
        printf("List is empty\n");
        return;
    }
    for (int i = 0; i < list->length; i++) {
        printf("%d ", list->data[i]);
    }
    printf("\n");
}

int main() {
    LinearList list;
    initList(&list);

    insert(&list, 10, 1);
    insert(&list, 20, 2);
    insert(&list, 30, 3);

    display(&list);

    return 0;
}

这个例子使用了结构体LinearList来表示线性表,其中包含一个整型数组data用于存储元素,以及一个length表示线性表的长度。通过使用不同的函数,我们可以实现初始化线性表、判断线性表是否为空或已满、在指定位置插入元素以及显示线性表中的元素。

C++语言实现线性表:

#include <iostream>
#include <vector>

using namespace std;

class LinearList {
private:
    vector<int> data;

public:
    void initList() {
        data.clear();
    }

    bool isEmpty() {
        return data.empty();
    }

    void insert(int element, int position) {
        if (position < 1 || position > data.size() + 1) {
            cout << "Invalid position" << endl;
            return;
        }
        data.insert(data.begin() + position - 1, element);
    }

    void display() {
        if (isEmpty()) {
            cout << "List is empty" << endl;
            return;
        }
        for (int i = 0; i < data.size(); i++) {
            cout << data[i] << " ";
        }
        cout << endl;
    }
};

int main() {
    LinearList list;
    list.initList();

    list.insert(10, 1);
    list.insert(20, 2);
    list.insert(30, 3);

    list.display();

    return 0;
}

在这个例子中,我们使用了C++中的vector容器来实现线性表。通过定义LinearList类,我们可以使用成员函数实现初始化线性表、判断线性表是否为空、在指定位置插入元素以及显示线性表中的元素。

这两个例子展示了如何使用C和C++来实现线性表。C++中的类和容器使得代码更加面向对象,提供了更高级的抽象和封装。而C语言则使用结构体和数组来实现基本的数据操作。 后续我们都已c++为主要语言。

线性表还有抽象数据类型:

 

是的,线性表可以作为抽象数据类型(Abstract Data Type,ADT)来进行定义和实现。抽象数据类型是一种数学模型,它描述了数据的逻辑结构以及对该结构执行的操作,而不考虑具体的实现细节。这样做的好处在于,可以将数据结构的实现与数据的使用分离,使得数据的操作更加清晰、简单,并且可以方便地在不同的实现中切换。

对于线性表来说,它可以被抽象为以下几个主要的操作:

  1. 初始化:初始化一个空的线性表。
  2. 销毁:释放线性表所占用的内存空间。
  3. 插入:在线性表的指定位置插入一个元素。
  4. 删除:删除线性表中指定位置的元素。
  5. 查找:根据给定的值,在线性表中查找对应的元素位置。
  6. 获取元素:获取线性表中指定位置的元素值。
  7. 长度:返回线性表中元素的个数。
  8. 判断空:判断线性表是否为空。
  9. 判断满:判断线性表是否已满(针对基于数组的实现)。

在C++中,我们可以使用类来实现线性表的抽象数据类型。以下是一个简单的示例:

#include <iostream>
#include <vector>

using namespace std;

class LinearList {
private:
    vector<int> data;

public:
    LinearList() {
        data.clear();
    }

    void insert(int element, int position) {
        // 在此省略插入代码
    }

    void remove(int position) {
        // 在此省略删除代码
    }

    int search(int element) {
        // 在此省略查找代码
    }

    int get(int position) {
        // 在此省略获取元素代码
    }

    int length() {
        return data.size();
    }

    bool isEmpty() {
        return data.empty();
    }
};

int main() {
    LinearList list;

    list.insert(10, 1);
    list.insert(20, 2);
    list.insert(30, 3);

    cout << "Length: " << list.length() << endl;
    cout << "Is Empty? " << (list.isEmpty() ? "Yes" : "No") << endl;

    return 0;
}

在上面的示例中,我们使用类LinearList来封装了线性表的操作。具体的操作细节在函数中实现,而在主函数中则展示了如何使用这些操作来操作线性表的数据。

使用抽象数据类型的好处在于,如果将来需要更改线性表的实现方式(例如,从使用向量切换到链表实现),只需修改类内部的实现,对外部的使用代码没有影响。这种分离的设计使得代码更具灵活性、可维护性和可扩展性。

数组

感觉数组没什么好说的,

变长一维数组(Variable-length one-dimensional array),简称变长数组,是指在程序运行时可以动态地改变其长度的一维数组。与传统的静态数组相比,静态数组的长度在编译时期就确定了,而变长数组的长度可以在运行时根据需要进行调整。

在C++中,变长数组可以使用标准库提供的容器类std::vector来实现。std::vector是C++标准库中的一个动态数组容器,可以根据需要动态调整其大小。当需要在运行时根据数据的实际情况调整数组长度时,std::vector非常有用。

类的相关知识前面已经提过了,就直接跳过吧

 

标签:12,线性表,int,list,c++,LinearList,length,data,day
From: https://www.cnblogs.com/jszs0013/p/17566714.html

相关文章

  • LeetCode 1201. Ugly Number III 数学+二分答案
    Anuglynumberisapositiveintegerthatisdivisibleby\(a\),\(b\),or\(c\).Givenfourintegers\(n\),\(a\),\(b\),and\(c\),returnthe\(n\)thuglynumber.Solution考虑如何二分答案,假设一个函数\(f(num,a,b,c)\)会得到\([1,num]\)中uglynumb......
  • [刷题记录Day4]Leetcode链表专题
    No.1题目两两交换链表中的节点思路模拟类型题目两个节点前后交换,同时记住原来的下一个节点虚拟头节点代码public ListNode swapPairs(ListNode head) { ListNode dummyHead = new ListNode(-1, head); ListNode cur = dummyHead; while (cur.next != ......
  • 初学C语言day03--数据类型及循环分支语句
    一、数据类型为什么要对数据进行分类?1、现实中的数据就是自带类别属性的2、对数据进行分类可以节约内存存储空间、提高运行速度存储空间的单位:Bit比特存储一个二进制位,只能存储0或者1,计算机存储数据的最小单位Byte字节存储八个二进制位,计算机存储数据的基本单位Kb102......
  • Day07_2.深浅copy之深copy
    使用场景:如果需要拷贝一个列表,并且让两个列表的改操作完全独立开,就用深copy,否则就用浅copy深拷贝:把可变和不可变类型做了区分对待,不可变类型的指向的还是原来的值id不变,可变类型指向的是新的值id改变1.深拷贝在拷贝原列表后会产生一个新列表id不相同: 2.深拷贝可变类型数据内的......
  • debian12 安装gitlab-ce
    curl-shttps://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh|sudobashsudoapt-getinstallgitlab-ce参考https://www.deviantdev.com/journal/debian-linux-remove-uninstall-gitlabhttps://cloud.tencent.com/document/product/213/4......
  • 128. 最长连续序列
    给定一个未排序的整数数组nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为O(n)的算法解决此问题。示例1:输入:nums=[100,4,200,1,3,2]输出:4解释:最长数字连续序列是[1,2,3,4]。它的长度为4。>方法一:双指针class......
  • Day-4 返回值
    常见问题中文显示ascci码  可以看到返回值变成了编码  ......
  • Python基础day48
    伪类选择器<style>/*未访问时候显示的*/a:link{color:#FF0000;}/*鼠标移动到链接上*/a:hover{color:#FF00FF}/*选定的链接鼠标点击时出现*/a:active{c......
  • Day07_1.深浅copy之浅copy
    浅拷贝原理:是把原列表第一层的内存地址不加区分的完全copy一份给新列表1.深浅copy之浅copy_1: 2.浅拷贝的id不同: 3.浅copy列表的内部元素是指向同一个的,所以单个元素的id相同: ......
  • day83(2023.7.19)
    1.使用SqlSession操作数据库 2.Mapper动态代理原理3. MyBatis新增 运行结果:4.MyBatis修改没优化前: 优化后:(只需写一次就ok了) 运行结果:4.MyBatis删除、根据Id查询 运行结果: 5.根据ID查询用户和运行结......