顺序表
定义
顺序表采用顺序存储方式,是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系
第n个元素 | 第n个元素的存放位置 |
---|---|
第一个元素 | LOC(L) |
第二个元素 | LOC(L)+数据元素的大小 |
第三个元素 | LOC(L)+2*数据元素的大小 |
如何知道一个数据元素的大小?
C语言:sizeof(ElemType)
(ElemType就是你的顺序表中存放的数据元素类型)
sizeof(int)=4B
sizeof(Customer)=8B
typedef struct{
int num;//号数
int pepole;//人数
}Customer;
顺序表的分类:
-
静态分配
-
动态分配
静态分配
用定长数组存储的方法称为静态分配,用一个定长数组data[]存储数据,用length记录实际的元素个数(顺序表长度),最大空间为maxsize==(大小一旦确定就不可以改变)==
#define Maxsize 100//定义最大长度
typedef struct{
ElemType data[Maxsize];//用静态的“数组”存放数据元素,element type
int length;//顺序表当前的长度
}SqList;//顺序表的类型定义(静态分配方式),sequence--顺序,序列
//elmtype:元素类型,需要什么类型就写什么类型
//用typedef将结构体等价于类项名sqlist
#include<stdio.h>
#define MaxSize 10//定义最大长度
typedef struct {
int data[MaxSize];//用静态数组存放数据元素//在内存中分配存储顺序表L的空间,包括MaxSize*sizeof(ElemTpr)10*4B和length(4B)的空间
int length;//顺序表当前长度
}SqList;
//基本操作--初始化一个顺序表
void InitList(SqList &L) {
for (int i = 0; i < MaxSize; i++)
L.data[i] = 0;//将所有数据元素设置为默认初始值(可省略)
L.length = 0;//顺序表出示长度是0
}
int main() {
SqList L;//声明一个顺序表
InitList(L);//初始化顺序表
//尝试违规打印整个data数组
for(int i=0;i<MaxSize;i++)//应该是i<L.length
printf("data[%d]=%d\n",i,l,data[i]);
//这种访问凡是也不够好,其实更好的做法是使用基本操作来方位哥哥数据元素GetElem(L,i)
return 0;
}
- 如果没有设置数据元素的默认值,会让内存中有遗留的脏数据(垃圾值)
给各个数据元素分配连续的存储空间,大小为MaxSize*sizeof(ElemType)
- 如果数组满了怎么办?
放弃治疗,顺序表的表长刚开始确定后就无法更改(存储空间是静态的)
- 如果刚开始就声明一个很大的内存空间呢?
浪费内存资源
动态分配
根据动态分配一段连续的空间,用elem记录该的基地址(首地址),用length记录世界的元素个数(顺序表的长度),大小为maxsize==(可调)但是时间开销大==
- 如果发生溢出,可以另外开辟一块更大的存储空间,用来替换原来的存储空间,从而达到存储空间的目的
#define InitSize 10//顺序表的初始长度
typedef struct{
ElemType *data;//指示动态分配数组的指针
int MaxSize;//顺序表的最大容量
int length;//顺序表的当前长度
}SqList;//顺序表的类型定义(动态分配方式)
//elmtype:元素类型,需要什么类型就写什么类型
//用typedef将结构体等价于类项名sqlist
//基地址,前面加*,表示取地址中的内容
key:动态申请和释放内存空间
c–malloc
、free
函数(包含在<stdlib.h>这个头文件里)
c+±-new
、delete
关键字
L.data=(ElemType*)malloc(sizeof(ElemType)*InitSize);
//malloc函数:申请一整片连续的存储空间
//ElemType*:malloc函数返回一个指针,需要强制转换成你定义的数据元素类型的指针
//L.data:指向了这一整片连续存储空间的起始地址,即data[0]
//sizeof(ElemType):一个数据元素的大小
//sizeof(ElemType)*InitSize:你要存储的数据元素总共的大小,malloc函数的参数,指明要分配多大的连续内存空间
#include<stdio.h>
#define InitSize 10//默认的最大长度
typedef struct {
int *data;//指示动态分配数组的指针
int MaxSize;//顺序表的最大容量
int length;//顺序表当前长度
}SqList;
//基本操作--初始化一个顺序表
void