前几天一直在修改八字循环的包 今天和控制接了一下,可以输出转角和速度,希望到时候实车的时候可以一步到位吧。
今天开始整数据结构。
先来理解线性表
线性表(英语: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)来进行定义和实现。抽象数据类型是一种数学模型,它描述了数据的逻辑结构以及对该结构执行的操作,而不考虑具体的实现细节。这样做的好处在于,可以将数据结构的实现与数据的使用分离,使得数据的操作更加清晰、简单,并且可以方便地在不同的实现中切换。
对于线性表来说,它可以被抽象为以下几个主要的操作:
- 初始化:初始化一个空的线性表。
- 销毁:释放线性表所占用的内存空间。
- 插入:在线性表的指定位置插入一个元素。
- 删除:删除线性表中指定位置的元素。
- 查找:根据给定的值,在线性表中查找对应的元素位置。
- 获取元素:获取线性表中指定位置的元素值。
- 长度:返回线性表中元素的个数。
- 判断空:判断线性表是否为空。
- 判断满:判断线性表是否已满(针对基于数组的实现)。
在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