顺序表:
用顺序存储的方式实现线性表 将物理逻辑上相邻的元素存储在相邻的位置上
复习malloc函数:
void *malloc(size_t size)
malloc函数的作用是开辟一块size大小的内存空间 并返回该内存空间指向的指针
(若分配失败 返回NULL)
在顺序表的实现中 最开始我们尝试静态存储
#define MaxSize 10
typedef struct{
ElemType data[MaxSize];
int length;//顺序表当前的长度
}SqList;
由于C语言数组长度的不可变性 当顺序表存储空间不足或者长度过大时都会造成问题
于是 引入顺序表的动态存储
#include<stdio.h>
#include<stdlib.h>
#define InitSize 10//默认顺序表的最大长度
typedef struct SeqList{
int* data; //指示动态分配数组的指针 接收malloc函数的返回值
int MaxSize;//顺序表的最大容量
int length;//顺序表当前的长度
}SeqList;
void InitList(SeqList &L) {
// sizeof获得单个int类型数据的内存 Initsize是最大容量
//二者相乘可以获得所需要最大的内存空间
L.data = (int*)malloc(InitSize * sizeof(int));
//返回指针后需要强制转换成自己定义的元素类型指针
L.length = 0;
L.MaxSize = InitSize;
//最开始的时候 顺序表的最大容量就是MaxSize
}
void IncreaseSize(SeqList &L, int len) {
int* p = L.data;
//用p指针接收原来顺序表的内存地址
int i = 0;
L.data = (int*)malloc((InitSize + len) * sizeof(int));
//将顺序表最大容量进行扩充 增加len个容量 开辟新的内存地址
for (i; i < L.length; i++) {
L.data[i] = p[i];
//将顺序表内原有的数据通过指针复制到新的内存地址里
}
L.MaxSize = L.MaxSize + len;
//
free(p);
//free函数 删除掉老的顺序表内存
}
int main() {
SeqList L;
InitList(L);
IncreaseSize(L, 5);
printf("现在顺序表的容量是%d", L.MaxSize);
return 0;
}