顺序表- -用顺序存储的方式实现线性表的顺序存储,把逻辑上相邻的元素存放在物理上也相邻的存储单元上,元素之间的关系由存储单元的邻接关系来体现。
顺序表是线性表的顺序存储表示,继承线性表的特点,所以假设顺序表初始位置为LOC(L),那么它第二个元素的位置即为LOC(L)加上一个数据元素的大小,第三个就是初始位置LOC(L)加上两个数据元素的大小,以此类推。
第N个元素就是初始位置LOC(L)加上(N-1)个数据元素的大小。
这里可以通过sizeof()运算符计算出数据类型所占的大小,例如sizeof(int)=4B,再比如有以下结构体:
typedef struct{
int name;
double age;
}People;
这里计算该结构体类型的大小为:
sizeof(People)=sizeof(int)+sizeof(double)=4 + 8 = 12B
(1)静态分配方式:静态分配就是使用数组来实现顺序表,但是数组必须是长度固定的,不然程序会报错,一旦数组长度确定,后期程序的运行不会改变顺序表的容量。
静态分配代码如下:
#define MaxSize 10 // 定义最大长度
typedef struct
{
int data[MaxSize]; //用静态“数组”存放数据元素
int length; //顺序表当前的长度
} SqList;//顺序表的类型定义
在定义了这个顺序表之后,系统会在内存中开辟一块MaxSize大小的连续空间,这时候还需要使用此初始化 *** 作,给顺序表所有位置元素置0,如果顺序表不置0,那么内存中可能会存在“脏数据”影响数据运算,导致结果出错,还需要将顺序表长度置0.具体代码如下:
#include
#include
#define MaxSize 10 // 定义最大长度
typedef struct
{
int data[MaxSize]; //用静态“数组”存放数据元素
int length; //顺序表当前的长度
} SqList;//顺序表的类型定义
//基本 *** 作--初始化一个顺序表
void InitList(SqList L)
{
for(int i=0; i<MaxSize; i++)
L.data[i]=0;//将所有数据元素设置为默认初始值0
L.length=0;//将线性表的长度设置为0
}
int main()
{ SqList L;//创建线性表L
InitList(L);//初始化线性表
return 0;
}
当我们长期使用这种静态分配方式的时候会发现如果我们的需求大于静态分配所提供的空间,我们就不能更改已经创建完成的顺序表的最大长度,我们要想继续使用,就必须重新创建一个能够匹配我们需求的顺序表,这样对开发人员来说不仅浪费时间,而且浪费空间。
那么让顺序表能够自动根据需求增加长度成为一种诉求。
(2)动态分配方式:存储数组的空间是在程序执行过程中通过动态存储分配语句分配的,一旦数据空间占满,就另外开辟一块更大的存储空间,用以替换原来的存储空间,这里要注意的是系统是另外开辟空间,而不是追加在原有的空间后面。
动态分配代码如下:
#define InitSize 10//顺序表的初始长度
#define ElemType int//定义通用类型,这里的int值可以更改为其他形式的数据类型
typedef struct
{
ElemType *data;//指示动态分配数组的指针
int MaxSize;//顺序表的最大容量
int length;//顺序表当前的长度
} SeqList; //顺序表的类型定义(动态分配方式)
这里要用到两个函数来实现内存的分配与释放,这两个函数在C语言中分别是malloc和free,例如要将顺序表L动态分配空间,系统会这样调用:
//在C中:
//分配语句
L.data=(ElemType*)malloc(sizeof(ElemType)*InitSize);
//释放语句
free(L);
//在C++中则是使用new和delete
L.data=new ElemType[InitSize];
顺序表的主要特点是:
- 随机访问,既是通过首地址和元素序号可在时间O(1)内找到指定的元素;
- 存储密度高,每个结点只存储数据元素;
- 顺序表逻辑上相邻的元素物理上也相邻,插入和删除要移动大量元素
本文大量内容是参考王道的《2023数据结构考研复习指导》一书,笔记为本人自己学习使用,如有写的不好的地方,还行各位不吝赐教!!考研中。
。
。
有事联系企鹅邮箱:2195207622@qq.com.
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)