顺序表三个重要组成部分:
1.顺序表的首地址,即存储的首地址
2.顺序表的长度
3.顺序表的大小
顺序表的基本操作:
1.建立和初始化
2.末尾添加元素
3.插入元素
4.删除指定位置的元素
5.删除指定数据的元素
6.销毁顺序表
自己的理解:
顺序表作为一种最简单的数据结构,类似于数组的升级版。也就是一个动态数组.也随时可以知道他现在有几个元素。
1.建立和初始化:
这个部分,根据顺序表的基本组成部分可知,应该建立一个结构体,定义一个指定类型的数据的指针,一个长度,一个大小
初始化的时候再根据指定的大小,动态分配一快内存给指针:
//定义循序表
#define MAX_SIZE 100
typedef struct sq_list {
int* elmes; //顺序表的首地址
int length; //顺序表的长度
int size; //顺序表的大小
}list;
//初始化循序表
bool initlist(list& my_list) {
my_list.elmes = new int[MAX_SIZE];
if (!my_list.elmes) {
cout << "分配内存失败!" << endl;
return false;
}
my_list.length = 0;
my_list.size = MAX_SIZE;
return true;
}
2.末尾添加元素
这个就是通过长度来实现的,长度就是最后一个元素的下一个位置,所以赋值的时候直接用长度就可,并且再赋值完以后,长度+1
bool Append(list &my_list,int e) {
if (my_list.length == my_list.size) {
cout << "空间已满!" << endl;
return false;
}
my_list.elmes[my_list.length] = e;
my_list.length++;
return true;
}
3.插入元素
因为循序表规定中间不能空,所以从要插入的位置开始,将后面的数据都向后以一个位置,腾出一个空间,将要插入的元素插入进去。再将长度+1
bool listinsert(list &my_list,int i,int e) {
if (i < 0 || i >= my_list.length) {
cout << "要插入的位置不合理" << endl;
return false;
}
if (my_list.length == my_list.size) {
cout << "空间已满" << endl;
return false;
}
//将数据往后移动一位
for (int j = my_list.length - 1;j >= i;j--) {
my_list.elmes[j + 1] = my_list.elmes[j];
}
my_list.elmes[i] = e;
my_list.length++;
return true;
}
4.删除指定位置的元素
5.删除指定数据的元素
将数据向前覆盖,再将长度-1,第5个与第4个的区别就是想要找到指定的元素的位置,再进行覆盖。
bool listDelete(list &list,int pos) {
if (pos < 0 || pos >= list.length) {
return false;
}
for (int i = pos;i < list.length - 1;i++) {
list.elmes[i] = list.elmes[i + 1];
}
list.length--;
return true;
}
bool listDelteF(list &list,int date) {
int index = -1;
for (int i = 0;i < list.length;i++) {
if (list.elmes[i] == date) {
index = i;
break;
}
}
if (index == -1) {
cout << "没有找到要删除的数据";
return false;
}
for (int i = index;i < list.length - 1;i++) {
list.elmes[i] = list.elmes[i + 1];
}
list.length--;
return true;
}
6.销毁顺序表
就是分配的内存空间删除掉,节省内存空间
void destroyList(list &list) {
if (list.elmes) delete[] list.elmes;
list.length = 0;
list.size = 0;
}
完整代码如下:
#include<iostream>
#include<Windows.h>
using namespace std;
#define MAX_SIZE 100
typedef struct sq_list {
int* elmes; //顺序表的首地址
int length; //顺序表的长度
int size; //顺序表的大小
}list;
bool initlist(list& my_list) {
my_list.elmes = new int[MAX_SIZE];
if (!my_list.elmes) {
cout << "分配内存失败!" << endl;
return false;
}
my_list.length = 0;
my_list.size = MAX_SIZE;
return true;
}
void listprint(list& my_list) {
cout << "顺序表的大小:" << my_list.size << " "
<< "顺序表的长度:" << my_list.length << endl;
for (int i = 0;i < my_list.length;i++) {
cout << my_list.elmes[i]<<" ";
}
cout << endl;
}
bool Append(list &my_list,int e) {
if (my_list.length == my_list.size) {
cout << "空间已满!" << endl;
return false;
}
my_list.elmes[my_list.length] = e;
my_list.length++;
return true;
}
bool listinsert(list &my_list,int i,int e) {
if (i < 0 || i >= my_list.length) {
cout << "要插入的位置不合理" << endl;
return false;
}
if (my_list.length == my_list.size) {
cout << "空间已满" << endl;
return false;
}
for (int j = my_list.length - 1;j >= i;j--) {
my_list.elmes[j + 1] = my_list.elmes[j];
}
my_list.elmes[i] = e;
my_list.length++;
return true;
}
bool listDelete(list &list,int pos) {
if (pos < 0 || pos >= list.length) {
return false;
}
for (int i = pos;i < list.length - 1;i++) {
list.elmes[i] = list.elmes[i + 1];
}
list.length--;
return true;
}
bool listDelteF(list &list,int date) {
int index = -1;
for (int i = 0;i < list.length;i++) {
if (list.elmes[i] == date) {
index = i;
break;
}
}
if (index == -1) {
cout << "没有找到要删除的数据";
return false;
}
for (int i = index;i < list.length - 1;i++) {
list.elmes[i] = list.elmes[i + 1];
}
list.length--;
return true;
}
void destroyList(list &list) {
if (list.elmes) delete[] list.elmes;
list.length = 0;
list.size = 0;
}
int main() {
list my_list;
int count, e;
int pos;
//1.顺序表的初始化
if (!initlist(my_list)) {
cout << "初始化失败!" << endl;
}
listprint(my_list);
//2.顺序表的添加数据
cout << "请输入要输入几个数:";
cin >> count;
for (int i = 0;i < count;i++) {
cout << "请输入数据:";
cin >> e;
if (Append(my_list, e)) {
cout << "输入成功" << endl;
}
else {
cout << "输入失败" << endl;
}
}
listprint(my_list);
//3.数据表的插入数据
cout << "请输入您要插入的位置和数据:";
cin >> pos >> e;
if (listinsert(my_list, pos, e)) {
cout << "插入成功!" << endl;
}
else {
cout << "插入失败!" << endl;
}
listprint(my_list);
//4.删除指定位置的元素
cout << "请输入要删除的下表:";
cin >> pos;
if (listDelete(my_list, pos)) {
cout << "删除成功!" << endl;
}else {
cout << "删除失败!" << endl;
}
listprint(my_list);
//5.删除指定的元素
int date;
cout << "请输入要删除的元素:";
cin >> date;
if (listDelteF(my_list, date)) {
cout << "删除成功!";
}
else {
cout << "删除失败!";
}
listprint(my_list);
//6.销毁顺序表
destroyList(my_list);
system("pause");
return 0;
}