线性表的顺序存储结构:
指的是用一段地址连续的存储单元一次存储线性表的数据元素。即在内存中找一块地址,通过占位的形式,占据一定内存空间,然后把相同数据类型的数据元素一次存放到这块空地中,因为线性表中的每个数据元素的类型都相同,所以可以用一维数组来实现顺序存储结构。
1.声明一个顺序存储结构。
#include "stdafx.h"
#include <iostream>
using namespace std;
//定义数组的最大长度
#define MAXSIZE 10
//声明一个顺序存储结构
struct SequenceTable
{
int data[MAXSIZE];
int length;
} mySequnceTable;
2.初始化顺序表,并向表中填充数据
//为顺序表填充数据,并增加表的长度
//其中 0=<insertLength<=MAXSIZE;
int insertLength=5;
for (auto i = 0; i < insertLength; i++)
{
mySequnceTable.data[i] = i * 2;
mySequnceTable.length++;
}
3.向表中的特定位置插入数据,并增加表的长度
//S代表要动态改变的顺序表
//pos表示要在表中插入元素的位置
//element表示要插入的元素
int Insert(SequenceTable *S, int pos, int element)
{
int k;
//如果当前表的长度超过了默认给定的最大长度,不执行任何操作
if (S->length == MAXSIZE) {
cout << "超出最大长度" << endl;
return 0;
}
//如果当前要插入的位置不在表可执行范围内,不执行任何操作
if (pos<1 || pos>S->length + 1) {
cout << "不在数组范围内" << endl;
return 0;
}
//如果可以插入,将插入位置之后的所有元素向后移动一位,并增加相应的表长
if (pos <= S->length)
{
for (k = S->length - 1; k >= pos - 1; k--)
{
S->data[k + 1] = S->data[k];
}
}
S->data[pos - 1] = element;
S->length++;
}
4.删除表中特定位置的元素
//S表示需要进行删除的顺序表
//pos表示删除表中的第几个元素,1表示删除第一个元素
bool Delete(SequenceTable *S,int pos)
{
if (pos<1||pos>S->length)
{
cout<<"超出当前数组范围"<<endl;
return false;;
}
if (pos<=S->length-1)
{
for (auto i=pos-1;i<S->length-1;i++)
{
S->data[i]=S->data[i+1];
}
}
S->length--;
return true;
}
5.main函数中测试代码如下:
int main()
{
int insertLength=5;
for (auto i = 0; i < insertLength; i++)
{
mySequnceTable.data[i] = i * 2;
mySequnceTable.length++;
}
cout << "插入前的数组元素" << endl;
for (auto i = 0; i < mySequnceTable.length; i++)
{
cout << mySequnceTable.data[i] << endl;
}
Insert(&mySequnceTable, 2, 10);
cout << "插入后的数组元素" << endl;
for (auto i = 0; i < mySequnceTable.length; i++)
{
cout << mySequnceTable.data[i] << endl;
}
if (Delete(&mySequnceTable,1))
{
cout << "删除后的数组元素" << endl;
for (auto i = 0; i < mySequnceTable.length; i++)
{
cout << mySequnceTable.data[i] << endl;
}
};
return 0;
}
总结:
优点:
线性表的顺序存储结构中不需要为表中元素之间的逻辑关系而增加额外的存储空间,可以很快速的存取表中任一位置的元素。
缺点:
每次向表中插入或者删除数据,需要移动大量的元素,当线性表长度变化比较大时,难以确定存储空间的容量 。
参考:《大话数据结构》 程杰
欢迎关注我的公众号,分享一些Unity3D、C#、C++数据结构和算法相关的学习知识。