顺序表的静态分配和动态分配

顺序表

顺序表:用顺序存储的方式实现线性表。

顺序存储:把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现

1、顺序表的实现——静态分配

#define MaxSize 10    			//宏定义最大长度
typedef struct{
    ElemType data[MaxSize];		//用静态的“数组”存放数据元素
    int length;					//顺序表的当前长度
}SqList;						//顺序表的类型定义(静态分配的方式)

静态数组的长度为MaxSize,定义后数组的长度不可改变,MaxSize表示数组最多可以存放多少数据元素,length表示当前已经存放的数据元素的多少。

ElemType表示数据元素的类型,根据需要可以为int,struct等。

程序1

#include #define MaxSize 10              //定义最大长度
typedef struct {    
    int data[MaxSize];          //用静态数组存放数据元素    
    int length;                 //顺序表的当前结构
}SqList;                        //顺序表的类型定义​
//基本操作--初始化一个顺序表
void InitList(SqList &L){
    L.length=0;                 //顺序表初始长度为0\
}
int main(){
	SqList L;                   //声明一个顺序表
    InitList(L);                //初始化顺序表    
    //尝试“违规打印整个data数组   
    for(int i=0;i

运行结果:

顺序表的静态分配和动态分配_第1张图片

程序2

#include 
#define MaxSize 10				//定义最大长度
typedef struct {
	int data[MaxSize];			//用静态数组存放数据元素
	int length;					//顺序表的当前结构
}SqList;						//顺序表的类型定义

//基本操作--初始化一个顺序表
void InitList(SqList &L){
	for(int i=0;i

运行结果:

顺序表的静态分配和动态分配_第2张图片

程序1和程序2相比较,程序2设置了数组元素的初始值,在运行结果来看, 程序2中个元素的初始值为0,而程序1没有给程序赋值,程序的运行结果中含有之前内存中遗留下来的“脏数据”。因此,在length的内存空间中,不知道之前有没有“脏数据”,因此,length的长度一定要初始化为0。

如果开始声明的数组 长度较小,在后续的使用中,内存不够,只能放弃。因为声明的数组是静态的,因此表长确定后就无法改变。如果开始声明一个很大的空间,但使用的空间较小,这样对于空间浪费太大,这种方法也是不可取的。

2、顺序表的实现——动态分配

#define InitSize 10  		//顺序表的初始长度
typedef struct{				
    ElemType *data;			//知识动态分配数组的指针
    int MaxSize;			//顺序表的最大容量
    int length;				//顺序表的当前长度
}SeqList;					//顺序表的类型定义(动态分配方式)

C语言中用malloc函数来动态申请一段内存空间,用free函数来动态释放一段内存空间。

L.data=(ElemType *)malloc (sizeof(ElemType)*InitSize);

程序3

#include 
#define InitSize 10
typedef struct {
    int *data;
    int MaxSize;
    int length;
}SeqList;

void InitList(SeqList &L){
    //用malloc函数申请一片连续的存储空间。
    L.data=(int *)malloc(InitSize*sizeof(int));
    L.data=0;
    L.MaxSize=InitSize;
}

//增加动态数组的长度
void IncreaseSize(SeqList &L,int len ){
    int *p=L.data;
    L.data=(int *)malloc((L.MaxSize+len)*sizeof(int));
    for(int i=0;i

用malloc函数申请一片内存空间,增加动态数组长度时,实际上是malloc开辟了一段新的内存空间,将原先内存空间的数据复制到新的内存空间中,然后释放掉原来的内存空间。

3、顺序表的特点

①随机访问。

②存储密度高,每个节点只存储数据元素。

③拓展容量不方便。(静态分配的数组无法扩展,动态分配的数组扩展的时间复杂度较高)

④插入、删除操作不方便,需要移动大量的数据。




- 王道考研《数据结构》视频学习笔记!

你可能感兴趣的:(数据结构,数据结构)