2020年11月23日
12:19
用C语言数组做顺序表,由于C语言数组的特性,普通数组只能预先定义空间大小,会导致空间浪费或数据溢出。
而如果用指针和malloc函数来实现顺序表结构则可以去除空间浪费和数据溢出的缺点。
我们来讲解一下指针和malloc函数实现“可变数组”的原理
首先我们要明白数组名是一个指针常量的概念,数组名是指针常量指向了数组元素首地址。
而数组元素是储存在从数组首地址开始的一片连续空间里的。
我们可以用malloc函数来开辟一个自定义大小的连续类型的地址,再用指针指向它首地址。
那么指针变量同样可以指向malloc开辟的连续空间首地址跟数组名一样使用。
数组名指向永远是数组首地址,数组大小定义后再无法改变,而指针变量指向的地址是可以变化的。
那么如果存储空间不足
1、可以再用malloc函数开辟一个更大的新空间,
2、再把原来的小空间的数据放到新的大空间里,
3、free清除掉原来的小空间占用的内存,
4、再把指针指向NULL,再重新初始指向新的大空间。
借此实现连续空间的增长。
指针和malloc函数实现空间扩展的原理我们可以用“可变数组”的概念来描述。
使用了可变数组来定义顺序表的存储方式,对数据的移位完全可以用数组下标来进行操作。
因为数组下标的“[]”就是一个运算符,可以计算出对应的地址。
我们只需对原来的普通数组结构实现的顺序表进行一些修改,
把普通数组换为该类型的指针变量,
添加创建可变数组的函数和可变数组空间自动增长的函数。
即可解决C语言数组做顺序表空间大小的限制,减小空间浪费和防止数据溢出。
C语言可变数组实现顺序表1
2020年11月25日
15:32
用指针和malloc函数来实现顺序表结构:
1、顺序表结构的定义:
1 2 3 4 5 6 7 8 9 10 |
#include #include #define INCREASE_SIZE 10 //数组自动增长大小的单位,例如超出10空间时,自动在申请10空间到达20空间。 /*定义线性表结构体类型orderly_table*/ typedef struct orderly_table { int* Data;//定义指针指向数据存储的连续地址 int lenght;//定义变量length,表示线性表当前存储的数据的长度,也就是数据元素的个数。 int size;//定义顺序表现占用的元素存储空间大小 }list; //利用typedef给结构体类型orderly_table定义一个别名list,方便用list来定义结构体类型变量 |
2、顺序表的创建和初始化:
一般顺序表L定义在主函数里,方便主函数调用其他函数的时候传给其他函数参数,
或者用其他函数创建后赋值给做函数。
/*创建可变数组的顺序表*/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
list create_L(int size)//函数参数size为初始存储空间大小 { list L;//在函数内定义一个list结构体变量L L.Data=(int*)malloc(size*sizeof(int));//把Data指针指向malloc新开辟的连续存储空间 L.lenght=0;//初始顺序表的元素个数为0,即长度为0,为空表。 L.size=size;//顺序表存储空间为参数size return L;//返回L给mian函数里创建的结构体变量赋值 } int main(void) { list L; printf("用可变数组实现的顺序表:\n"); printf("请输入用可变数组的初始存储空间大小&#x |