所谓动态分配,就是可以动态地增加顺序表的容量用以加入新元素。如何实现动态分配?首先定义顺序表的初始长度InitSize为10,在Seqlist类型中定义一个int型的指针data,关于为什么要用int型的指针,文末会进行说明,用于指向顺序表中的第一个元素,设置一个MaxSize定义顺序表的最大长度,算是一个临界值吧,你动态增加容量不允许超过这个MaxSize,否则会溢出报错。这里我们使用C中的malloc函数实现动态分配,malloc函数会申请一片连续的内存空间,这一片内存空间会有一个起始地址,malloc函数执行完毕之后会返回(return)一个指向该起始地址的指针,因为我们前面定义的是int型的数据,所以这里我们需要让malloc函数返回一个int型的指针,需要强制转换,这也就是为什么前面需要定义一个int型指针。malloc后面是你申请的内存空间的大小,比如这里写成了InitSize*sizeof(int),如果int占4字节,那么这个空间初始就是10*4=40B。
接下来分析整个过程,首先在main中声明一个顺序表SeqList,这一句执行完之后,计算机就会在内存中开辟一小片内存空间,用来存放 *data、MaxSize和length;接下来调用InitList函数,进入这个函数,开始调用malloc函数,申请空间,返回指针,指向data[0],把顺序表的当前长度设置为0,InliSize赋值给MaxSize,这样一来 MaxSize为10,length为10,data[0]到data[9]一共10个元素,容量不够用就增加,这里使用IncreaseSize函数,里面的参数len就是你想增加的元素数量,定义一个指针p,将data指针赋值给p,这个语句的作用就是使得p和data都指向同一个位置,接下来调用malloc函数,开辟一块新的更大的内存空间而不是只开辟一块新增的空间,这个要明白,然后L.data[i]=p[i];将数据复制到新区域,之后更新最大长度,最后使用free函数释放p所指向的内存空间,也就是原来的不用的空间。动态分配的整个过程就是这样的......
P.S使用malloc、free函数需要包含头文件,即#include<stdlib.h>
这个过程的图解如下
、
整个过程就是这7张图......最后使用free函数将p指向的空间释放掉,防止浪费。
这里附上代码!
#include <stdio.h>
#include <stdlib.h>
#define InitSize 10//定义顺序表的初始长度
typedef struct{
int *data;
int MaxSize;
int length;
}SeqList;//使用typedef关键字将 struct类型重定义为SeqList型
void InitList(SeqList &L){
L.data=(int *)malloc(InitSize*sizeof(int));
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);
for(int i=0;i<InitSize;i++){
L.data[i]=99;
printf("%d ",L.data[i]);
};
return 0;
}
我们在main函数中使用for循环遍历顺序表,初值设置为99,运行如下:
感谢阅读!
2024.4.17
更新修改了一下,实例如下:
#include <stdio.h>
#include <stdlib.h>
#define InitSize 10//定义顺序表的初始长度
typedef struct{
int *data;
int MaxSize;
int length;
}SeqList;//使用typedef关键字将 struct类型重定义为SeqList型
void InitList(SeqList &L){
L.data=(int *)malloc(InitSize*sizeof(int));
L.length=InitSize;
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);
int len;
IncreaseSize(L,7);
printf("动态分配前的顺序表:\n");
for(int i=0;i<InitSize;i++){
L.data[i]=99;
printf("%d ",L.data[i]);
}
printf("\n");
printf("顺序表原先的长度是: %d\n",L.length);
printf("动态分配后的顺序表:\n");
for(int i=0;i<InitSize+7;i++){
L.data[i]=99;
printf("%d ",L.data[i]);
}
printf("\n");
printf("顺序表此时的长度是:%d",L.MaxSize);
return 0;
}
感谢阅读!