2025年数据结构——顺序表(C++)

数据结构——顺序表(C++)前言 顺序表的本质其实就是使用一个数组对数据进行存储 我们在此博客中 基于 C 的类与对象来实现顺序表 一 构成 顺序表由三个部分组成 一个数组 一个用来表示数组容量的整型和一个表示已存放数据数量的整型 所以我们的成员变量就如下

大家好,我是讯享网,很高兴认识大家。

前言:

顺序表的本质其实就是使用一个数组对数据进行存储,我们在此博客中,基于C++的类与对象来实现顺序表。

一、构成:

顺序表由三个部分组成,一个数组,一个用来表示数组容量的整型和一个表示已存放数据数量的整型。


讯享网

所以我们的成员变量就如下:

typedef int ElemType; class SqList { private: ElemType* data; int size; int capacity; };

讯享网

我们需要实现的功能有:插入,删除,打印,查找,更改。同时,我们对类的内部操作还有初始化,扩容,销毁等操作。

二、包含

在使用C++实现顺序表的时候,我们只需要包含一个头文件<iostream>,但是们可以提前展开命名空间std。

讯享网#include<iostream> using namespace std;

三、函数实现

1)初始化

初始化在此可以作为类的构造函数,其参数可以使用一个缺省参数。

SqList(int n = 4) { data = (ElemType*)malloc(sizeof(ElemType) * n); size = 0; capacity = n; }

函数说明:构造函数SqList在对象实例化的时候自动调用,在实例化的时候,缺省参数n可以传值,也可以用默认值,为data开辟一块空间,并且将size初始化为0,容量capacity初始化为n。

2)销毁

销毁在此处可以作为类的析构函数,类生命周期结束时自动调用。

讯享网~SqList() { free(data); data = nullptr; capacity = 0; size = 0; }

函数说明:将data的空间释放,data指向空,容量和大小都设为0.

3)扩容

该函数不被类外调用,所以可将其放在private修饰,其作用时当顺序表满了时,将顺序表扩容一倍。

 void boarden() { ElemType* tmp = (ElemType*)realloc(data, sizeof(ElemType) * capacity * 2); if (tmp) { data = tmp; capacity = capacity * 2; } else perror("boarden error!"); }

函数说明:要先用tmp储存并且验证是否扩容成功,以免造成扩容失败同时原内存丢失。

4)插入

在数组的第pos个位置插入数据

思路:将pos位置及以后的数据往后推移一个位置,再将数据填到对应位置。但是推移的时候,必须从后面往前面推移,而不是从前往后推,否则会将原来的数据覆盖。

讯享网void insert(int pos, int val) { if (size == capacity) boarden(); for (int i = size - 1; i >= pos - 1; i--) { data[i + 1] = data[i]; } data[pos - 1] = val; size++; }

5)删除

删除pos位置的数据

思路:将pos位置之后的数据往前面运动即可,从pos+1位置到第size个位置。注意此时必须从前往后移动,否则原来数据会被覆盖。

 

void del(int pos) { if (size) { for (int i = pos - 1; i < size; i++) { data[i] = data[i + 1]; } size -= 1; } else perror("Delete Fail,Empty List"); }

6)查找

查找并返回第一个大小为val的位置

思路:遍历并比对其值

讯享网int find(ElemType val) { for (int i = 0; i < size; i++) { if (data[i] == val) return i + 1; } }

7)打印

将顺序表按序打印出来

思路:遍历并打印其值

void print() { for (int i = 0; i < size; i++) cout << data[i] << " "; cout << endl; }

四、源码分享

讯享网#include<iostream> using namespace std; typedef int ElemType; class SqList { private: ElemType* data; int size; int capacity; void boarden() { ElemType* tmp = (ElemType*)realloc(data, sizeof(ElemType) * capacity * 2); if (tmp) { data = tmp; capacity = capacity * 2; } else perror("boarden error!"); } public: SqList(int n = 4) { data = (ElemType*)malloc(sizeof(ElemType) * n); size = 0; capacity = n; } ~SqList() { free(data); data = nullptr; capacity = 0; size = 0; } void insert(int pos, int val) { if (size == capacity) boarden(); for (int i = size - 1; i >= pos - 1; i--) { data[i + 1] = data[i]; } data[pos - 1] = val; size++; } void del(int pos) { if (size) { for (int i = pos - 1; i < size; i++) { data[i] = data[i + 1]; } size -= 1; } else perror("Delete Fail,Empty List"); } void print() { for (int i = 0; i < size; i++) cout << data[i] << " "; cout << endl; } int find(ElemType val) { for (int i = 0; i < size; i++) { if (data[i] == val) return i + 1; } } };

小讯
上一篇 2025-03-16 15:09
下一篇 2025-01-09 20:25

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/57634.html