c语言 vector元素比大小max_7、C语言顺序表的实现+可变数组结构

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值