顺序表的实现(动态分配)

        所谓动态分配,就是可以动态地增加顺序表的容量用以加入新元素。如何实现动态分配?首先定义顺序表的初始长度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;
 }

感谢阅读!

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值