// resizable array

/*
Think about a set of functions that provide a mechanism of resizable array of int.
• Growable
• Get the current size
• Access to the elements
*/ /*
the Interface
• Array array_create(int init_size);
• void array_free(Array *a);
• int array_size(const Array *a);
• int* array_at(Array *a, int index);
• void array_inflate(Array *a, int more_size);
*/
typedef struct
{
int* array;
int size;
} Array; #define BLOCK_SIZE 16 Array array_create(int init_size)
{
Array a;
a.array = (int*)malloc(sizeof(int) * init_size);
a.size = init_size;
return a;
} void array_free(Array *a)
{
free(a->array);
a->size = 0;
} int array_size(const Array *a)
{
return a->size;
} void array_inflate(Array *a, int more_size)
{
int* p = (int*)malloc(sizeof(int) * (a->size + more_size));
for ( int i=0; i<a->size; i++ )
{
p[i] = a->array[i];
}
free(a->array);
a->array = p;
a->size = a->size + more_size;
} void array_inflate(Array *a, int more_size)
{
int* p = (int*)malloc(sizeof(int) * (a->size + more_size));
memcpy((void*) p, (void*) a->array, a->size*sizeof(int));
free(a->array);
a->array = p; a->size = a->size+more_size;
} int* array_at(Array *a, int index)
{
if ( index >= a->size )
{
array_inflate(a,
(index/BLOCK_SIZE+1) * BLOCK_SIZE-a->size);
}
return &(a->array[index]);
} int test()
{
// use array_at()
Array a = array_create(10);
*(array_at(&a, 5)) = 6;
*(array_at(&a, 10)) = *(array_at(&a, 5));
} /*
will it be better
• to have two access functions:
• array_get(), and
• array_set() Array a = array_create(10);
array_set(&a, 5, 6);
array_set(&a, 10, array_get(&a, 5));
*/

未完待续,后续补充链式分块扩容数组(二维数组),以及C++ Vector实现

参考:C语言进阶- 浙江大学Mooc

【数据结构】C语言实现动态扩容数组的更多相关文章

  1. c语言实现动态指针数组Dynamic arrays

    c语言实现动态数组.其它c的数据结构实现,hashTable參考点击打开链接 treeStruct參考点击打开链接 基本原理:事先准备好一个固定长度的数组. 假设长度不够的时候.realloc一块区域 ...

  2. 数据结构(C语言第2版)-----数组,广义表,树,图

    任何一个算法的设计取决于选定的数据结构,而算法的实现依赖于采用的存储结构. 之前线性表的数据元素都是非结构的原子类型,元素的值是不可再分的.下面学习的这两个线性表是很特殊的,其中数据元素本身也可能是一 ...

  3. 数据结构C语言版--动态顺序表的基本功能实现(二)

    /* * 若各个方法结构体变量参数为: &L(即地址符加变量)则结构体变量访问结构成员变量时使用"." * 若为:*L(即取地址符加变量)则结构体变量访问结构体成员变量使用 ...

  4. 数据结构基础(1)--数组C语言实现--动态内存分配

    数据结构基础(1)--数组C语言实现--动态内存分配 基本思想:数组是最常用的数据结构,在内存中连续存储,可以静态初始化(int a[2]={1,2}),可以动态初始化 malloc(). 难点就是数 ...

  5. <数据结构系列1>封装自己的数组——手写动态泛型数组(简化版ArrayList)

    哈哈,距离上一次写博客已经快过去半个月了,这这这,好像有点慢啊,话不多说,开始我们的手写动态泛型数组 首先是我们自己写一个自己的动态数组类,代码如下所示: public class Array< ...

  6. Android JNI编程(五)——C语言的静态内存分配、动态内存分配、动态创建数组

    版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一:什么是静态内存什么又是动态内存呢? 静态内存:是指在程序开始运行时由编译 ...

  7. Java数据结构和算法(二)——数组

    上篇博客我们简单介绍了数据结构和算法的概念,对此模糊很正常,后面会慢慢通过具体的实例来介绍.本篇博客我们介绍数据结构的鼻祖——数组,可以说数组几乎能表示一切的数据结构,在每一门编程语言中,数组都是重要 ...

  8. 程序猿修仙之路--数据结构之你是否真的懂数组? c#socket TCP同步网络通信 用lambda表达式树替代反射 ASP.NET MVC如何做一个简单的非法登录拦截

    程序猿修仙之路--数据结构之你是否真的懂数组?   数据结构 但凡IT江湖侠士,算法与数据结构为必修之课.早有前辈已经明确指出:程序=算法+数据结构  .要想在之后的江湖历练中通关,数据结构必不可少. ...

  9. c++学习书籍推荐《清华大学计算机系列教材:数据结构(C++语言版)(第3版)》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <清华大学计算机系列教材:数据结构(C++语言版)(第3版)>习题解析涵盖验证型.拓展型.反思型.实践型和研究型习题,总计290余道大题.525道 ...

  10. C语言中动态内存分配的本质是什么?

    摘要:C语言中比较重要的就是指针,它可以用来链表操作,谈到链表,很多时候为此分配内存采用动态分配而不是静态分配. 本文分享自华为云社区<[云驻共创]C语言中动态内存分配的本质>,作者: G ...

随机推荐

  1. Linux下修改MySQL可以远程访问

    所有操作均在MySQL命令行下执行,进入MySQL命令行:mysql -uroot -p #允许root账户远程登录 update mysql.user set host='%' where user ...

  2. 26岁的超经典音乐播放器Winamp归来!UI彻底重构:支持iOS/安卓

    快科技4月18日讯,还记得Winamp吗? 这款1997年首发的媒体播放器,已经走过了26年的历史.它凭借高度简洁.大量的皮肤.丰富的定制性.多元的格式支持等成为有史以来最好的音乐播放器之一. 当年的 ...

  3. 【C语言深度解剖】预定义章节经典面试题讲解(offsetof宏模拟实现)【超详细的解释和注释】

    [C语言深度解剖]预定义章节经典面试题讲解(offsetof宏模拟实现)[超详细的解释和注释] 那么这里博主先安利一下一些干货满满的专栏啦! 作者: #西城s 这是我的主页:#西城s 在食用这篇博客之 ...

  4. tp使用workerman消息推送

    安装 首先通过 composer 安装 composer require topthink/think-worker SocketServer 在命令行启动服务端 php think worker:s ...

  5. electron useContentSize的详解

    useContentSize作用就是  由于window窗体有边框和title区域menu等,该区域不能显示自己的html页面(new BrowserWindow 时设置frame=false禁用边框 ...

  6. Delphi - Case 可以多条件 指定在一起,今天才知道;逗号分隔

  7. Excel中文本型数字转换为数值型数字的方法

    背景 工作中经常遇到需要将Excel中的内容进行求和或者其他计算,但是由于格式为文本,无法进行计算和求和. 单元格的左上角都有绿色小三角,且用自动求和公式计算无法计算结果,显示为0,说明单元格格式为文 ...

  8. 回顾复习之背包DP

    \(\small{(本文统一将c[i]视作cost,w[i]视作worth,下面的代码用这两个变量表示费用和价值)}\) \(\Large\textbf{1. 01背包}\) \(\large\tex ...

  9. Linux查看系统版本的方法

    记录几种查看当前Linux系统的版本的方法 一.使用命令:cat /proc/version 查看 linux版本号:Linux version 5.4.0-99-generic (buildd@lg ...

  10. centos7搭建postgresql主从(主备)架构

    本篇介绍如何在centos7系统搭建一个postgresql主备集群实现最近的HA(高可用)架构.后续更高级的HA模式都是基于这个最基本的主备搭建. 节点规划 ip 主机名 用途 192.168.18 ...