顺序表的原理
顺序表是简单的一种线性结构,逻辑上相邻的数据在计算机内的存储位置也是相邻的,可以快速定位第几个元素,中间不允许有空值,插入、删除时需要移动大量元素
顺序表的三要素
1.用 elems 记录存储位置的基地址
2.分配一段连续的存储空间 size
3.用 length 记录实际的元素个数,即顺序表的长度
结构体定义
结构体定义
#define MAX_SIZE 100
struct _SqList{
ElemType *elems; // 顺序表的基地址
int length; // 顺序表的长度
int size; // 顺序表总的空间大小
}
顺序表的实现
顺序表的初始化
typedef struct { //定义顺序表
int* elems; //数组的第0个元素
int length;
int size;
}Sqlist;
bool initList(Sqlist& L) { //初始化顺序表
L.elems = new int[MAX_SIZE];
if (!L.elems) {
cout << "内存分配失败!" << endl;
return false;
}
else if (L.elems) {
cout << "初始化成功!" << endl;
L.length = 0;
L.size = MAX_SIZE;
for (int i = 0; i <= MAX_SIZE - 1; i++) {
L.elems[i] = NULL;
}
return true;
}
cout << "未知错误!!" << endl;
return false;
}
顺序表的输出
void print(Sqlist& L) { //输出顺序里面的数据
int j = 0;
for (int i = 0; i < L.length; i++) {
cout << L.elems[i] << " ";
j++;
if (j == 10) {
cout << endl;
j = 0;
}
}
cout << endl;
}
从尾部添加数据
bool Add(Sqlist& L, int e) { //从尾部添加数据
if (L.length == L.size || L.length > L.size) {
cout << "内存已满!!" << endl;
return false;
}
else if (L.length != L.size) {
L.elems[L.length] = e;
L.length++;
return true;
}
cout << "未知错误!!" << endl;
return false;
}
bool input_tail(Sqlist& L) { //从尾部输入数据
int e = NULL;
int count = NULL;
cout << "你要输入几个数据:";
cin >> count;
for (int i = 0; i < count; i++) {
cout << "请输入第" << i + 1 << "个元素:";
cin >> e;
if (Add(L, e)) {
e = NULL;
cout << "输入成功!!" << endl;
}
else {
cout << "输入失败!!" << endl;
return false;
}
}
}
任意位置插入数据
bool input_random(Sqlist& L, int a, int b) {// a插入位置 b 插入数据
if (L.length == L.size || L.length > L.size) { //检查是否还有内存
return false;
}
if (a<0 || a > L.length) { //插入位置合法性判断
return false;
}
for (int i = L.length - 1; i >= a; i--) {
/*
//i是最后一个元素插入位置的
//a必须小于最后一个元素i
*/
L.elems[i + 1] = L.elems[i];
}
L.elems[a] = b;
L.length++;
return true;
}
bool input(Sqlist& L) { //插入数据
int count = NULL;
int e = NULL;
int f = NULL;
cout << "请输入需要插入元素的个数:";
cin >> count;
for (int i = 0; i < count; i++) {
cout << "请输入插入位置以及插入数据,空格分开:";
cin >> f >> e;
if (input_random(L, f, e)) {
cout << "插入成功!" << endl;
e = NULL;
f = NULL;
}
else {
cout << "插入失败!" << endl;
return false;
}
}
}
删除元素
bool Delete(Sqlist& L, int n) { //删除顺序表中的元素
if (L.length == L.size) { return false; }
if (n<0 || n>L.length) { return false; }
if (n == L.length - 1) {
L.length--;
return true;
}
for (int i = n; i < L.length - 1; i++) { //被删除元素之后的元素前移
/*
//L.elems[i + 1]是被删除目标元素的后一个元素
//把这个元素前移一位就覆盖掉原来的数据,而实现删除
*/
L.elems[i] = L.elems[i + 1];
}
L.length--;
return true;
}
bool Remove(Sqlist& L) {
int count = NULL;
int e = NULL;
cout << "请输入需要删除元素的个数:";
cin >> count;
for (int i = 0; i < count; i++) {
cout << "请输入需要删除元素的下标:";
cin >> e;
if (Delete(L, e)) {
cout << "删除成功!!" << endl;
}
else {
cout << "删除失败!!" << endl;
return false;
}
}
return true;
}
查询数据
bool inquire(Sqlist& L, int n) { //查询数据
if (L.length == L.size || L.length > L.size || L.length == 0) { return false; }
for (int i = 0; i < L.length; i++) {
if (L.elems[i] == n) {
return true;
}
}
return false;
}
void inquire(Sqlist& L) {
int tmp = 0;
cout << "请输入需要查询的元素:";
cin >> tmp;
if (inquire(L, tmp)) {
cout << "查询的:" << tmp << "存在!" << endl;
}
else {
cout << "查询失败!" << endl;
}
}
内存回收
void Empty(Sqlist& L) {
if (L.elems) {
delete[]L.elems;
L.length = NULL;
L.size = NULL;
cout << "内存回收成功!!" << endl;
}
}
完整代码
#include <iostream>
#include <Windows.h>
#define MAX_SIZE 100 //顺序可存入的最多个元素
using namespace std;
typedef struct { //定义顺序表
int* elems; //数组的第0个元素
int length;
int size;
}Sqlist;
bool initList(Sqlist& L) { //初始化顺序表
L.elems = new int[MAX_SIZE];
if (!L.elems) {
cout << "内存分配失败!" << endl;
return false;
}
else if (L.elems) {
cout << "初始化成功!" << endl;
L.length = 0;
L.size = MAX_SIZE;
for (int i = 0; i <= MAX_SIZE - 1; i++) {
L.elems[i] = NULL;
}
return true;
}
cout << "未知错误!!" << endl;
return false;
}
void print(Sqlist& L) { //输出顺序里面的数据
int j = 0;
for (int i = 0; i < L.length; i++) {
cout << L.elems[i] << " ";
j++;
if (j == 10) {
cout << endl;
j = 0;
}
}
cout << endl;
}
bool Add(Sqlist& L, int e) { //从尾部添加数据
if (L.length == L.size || L.length > L.size) {
cout << "内存已满!!" << endl;
return false;
}
else if (L.length != L.size) {
L.elems[L.length] = e;
L.length++;
return true;
}
cout << "未知错误!!" << endl;
return false;
}
bool input_random(Sqlist& L, int a, int b) {// a插入位置 b 插入数据
if (L.length == L.size || L.length > L.size) { //检查是否还有内存
return false;
}
if (a<0 || a > L.length) { //插入位置合法性判断
return false;
}
for (int i = L.length - 1; i >= a; i--) {
/*
//i是最后一个元素插入位置的
//a必须小于最后一个元素i
*/
L.elems[i + 1] = L.elems[i];
}
L.elems[a] = b;
L.length++;
return true;
}
bool input(Sqlist& L) { //插入数据
int count = NULL;
int e = NULL;
int f = NULL;
cout << "请输入需要插入元素的个数:";
cin >> count;
for (int i = 0; i < count; i++) {
cout << "请输入插入位置以及插入数据,空格分开:";
cin >> f >> e;
if (input_random(L, f, e)) {
cout << "插入成功!" << endl;
e = NULL;
f = NULL;
}
else {
cout << "插入失败!" << endl;
return false;
}
}
}
bool input_tail(Sqlist& L) { //从尾部输入数据
int e = NULL;
int count = NULL;
cout << "你要输入几个数据:";
cin >> count;
for (int i = 0; i < count; i++) {
cout << "请输入第" << i + 1 << "个元素:";
cin >> e;
if (Add(L, e)) {
e = NULL;
cout << "输入成功!!" << endl;
}
else {
cout << "输入失败!!" << endl;
return false;
}
}
}
bool Delete(Sqlist& L, int n) { //删除顺序表中的元素
if (L.length == L.size) { return false; }
if (n<0 || n>L.length) { return false; }
if (n == L.length - 1) {
L.length--;
return true;
}
for (int i = n; i < L.length - 1; i++) { //被删除元素之后的元素前移
/*
//L.elems[i + 1]是被删除目标元素的后一个元素
//把这个元素前移一位就覆盖掉原来的数据,而实现删除
*/
L.elems[i] = L.elems[i + 1];
}
L.length--;
return true;
}
bool inquire(Sqlist& L, int n) { //查询数据
if (L.length == L.size || L.length > L.size || L.length == 0) { return false; }
for (int i = 0; i < L.length; i++) {
if (L.elems[i] == n) {
return true;
}
}
return false;
}
void inquire(Sqlist& L) {
int tmp = 0;
cout << "请输入需要查询的元素:";
cin >> tmp;
if (inquire(L, tmp)) {
cout << "查询的:" << tmp << "存在!" << endl;
}
else {
cout << "查询失败!" << endl;
}
}
bool Remove(Sqlist& L) {
int count = NULL;
int e = NULL;
cout << "请输入需要删除元素的个数:";
cin >> count;
for (int i = 0; i < count; i++) {
cout << "请输入需要删除元素的下标:";
cin >> e;
if (Delete(L, e)) {
cout << "删除成功!!" << endl;
}
else {
cout << "删除失败!!" << endl;
return false;
}
}
return true;
}
void Empty(Sqlist& L) {
if (L.elems) {
delete[]L.elems;
L.length = NULL;
L.size = NULL;
cout << "内存回收成功!!" << endl;
}
}
int main(void) {
Sqlist s1; //定义顺序表
initList(s1); //初始化顺序表
bool q = input_tail(s1); //从尾部插入数据
print(s1);
bool w = input(s1); //任意位置插入数据
print(s1); //输出顺序表中的数据
inquire(s1); //查询顺序表中的数据
bool e = Remove(s1); //删除顺序表中的数据
print(s1);
Empty(s1); //回收顺序表的内存
return NULL;
}