数据表的定义
顺序表就是数组,但是在数组的基础上,它还要求数据是连续,从头开始存储的,不能跳跃间隔,这个数组使用的是一片连续的内存空间。
以下代码是线性表的简单定义
#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;
L.length = 0;
}
int main()
{
SqList L;
InitList(L);
return 0;
}
当然InitList函数并非一定要去定义,可以不进行定义,只是线性表内会有之前内存中所含有的数据,如果不对线性表进行赋值覆盖,直接打印,此时的数据将会是依托答辩。
但是这种定义方式定义死了这个顺序表的大小(大小由MaxSize控制,控制为10),这种方式一开始就把顺序表的容量规定死了,无法更改,且如果超出了容量,程序会报错,无法继续运行。
顺序表的空间分配
静态分配
#define MaxSize 10
typedef struct {
int data[MaxSize];
int length;
}Sqlist;
而这种方式就是程序的静态分配,这时候就可以脑洞大开一下,为了不超出顺序表的容量,将MaxSize定义的特别大,这样我们不就拥有了结晶与无限的容量了吗,的确可以这么干,但是这个程序在内存中的占用将是巨大的,并不利于程序的运行。因此我们有了更优的顺序表定义方式动态分配。
动态分配
#define InitSize 10
typedef struct {
int* data;
int MaxSize;
int Length;
}SeqList;
在具体实践中会用到,malloc和free这两个函数
mallo函数
malloc函数是动态分配内存空间的函数,需要用<stdlib.h>的头文件,
#include <stdio.h>
#include <stdlib.h>
#define InitSize 10
typedef struct {
int* data;
int Maxsize;
int length;
}SeqList;
void InitList(SeqList) {
L.data = (int*)malloc(InitSize * sizeof(int));//申请了一个定义的InitSize大小乘以int大小的内存,由于前面加上了一个(int*),所以malloc最后传入data必定为整型
L.length = 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 <L.length; i++)
{
L.data[i] = p[i];
}
L.Maxsize = L.Maxsize + len;
free(p);
}
int main() {
SeqList L;
InitList(L);
IncreaseSize(L, 5);
return 0;
}