C语言动态数组数据类型(动态数组库)

C语言动态数组数据类型(动态数组库)


动态数组库功能设计

静态数组一经创建大小不能改变。动态数组更灵活,可以在程序运行时根据需要指定数组大小。
利用C语言实现抽象数据类型(ADT)的方法C语言实现抽象数据类型(ADT),实现动态数组数据类型。
这个动态数组功能有:

  1. 从头部插入元素;从尾部插入元素;根据下标访问、插入、删除元素等。
  2. 可用回调函数遍历动态数组。

以下是头文件dynints.h

#ifndef DYNINTS_H
#define DYNINTS_H

struct DYNINTS;
typedef struct DYNINTS * PDYNINTS;

/*创建动态数组,参数是数组元素最大个数,返回动态数组指针*/
PDYNINTS create_dynints(int capacity);
/*在头部插入元素*/
void insert_head(PDYNINTS di_array, int element);
/*在尾部插入元素*/
void insert_tail(PDYNINTS di_array, int element);
/*根据下标插入元素,index参数为下标值*/
void insert_by_index(PDYNINTS di_array, int element, int index);
/*返回数组元素个数*/
int array_length(PDYNINTS di_array);
/*判断是否为空,空返回1*/
bool Is_empty(PDYNINTS di_array);
/*根据下标访问元素,模拟C语言,C语言没有引用,只能返回地址*/
int * access_by_index(PDYNINTS di_array, int index);
/*根据下标删除元素*/
void delete_by_index(PDYNINTS di_array, int index);
/*数组的复制(已有一个普通数组array),参数为数组名称和元素个数。*/
void duplicate_array(PDYNINTS di_array, int * array, int count);
/*销毁动态数组*/
void destroy_array(PDYNINTS di_array);
/*func回调函数遍历动态数组*/
void travel_array(PDYNINTS di_array, void (*func)(int * data));

#endif

源文件、具体实现

  1. 这里是用memcpy内存复制函数进行动态数组更新的。其函数原型为void *memcpy(void *destin, void *source, unsigned n),要注意参数填写正确。我记得我第一次写的时候把函数指针运算的结果和地址概念搞错了:假设p是一个T *类型的指针,而n是一个整型变量或常量,那么p+n是一个类型为T *类型的指针变量,它指向的地址是p + n × sizeof(T)。填入memcpy的前两个参数应该是指针变量。有时有的书上会把指针、指针变量、地址混起来说,比较容易混淆。指针可以等价于地址,指针变量是存储地址的变量。但经常把指针变量P直说成指针P
  2. 回调函数是个好东西,在测试程序中简单用个输出函数来测试回调函数遍历动态数组的。
  3. 我是用new和delete写的,没用malloc、free。用在这里没区别。new和delete用在C++的对象上会调用构造函数析构函数。new和delete底层也是通过malloc和free实现的。malloc和free是函数,new和delete是运算符,可以重载new和delete以实现自己的内存管理策略。

dynints.cpp

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include "dynints.h"

using namespace std;

struct DYNINTS{
   
    int capacity; //最大容量
    int count;  //实际存储了多少个
    int *items;  //动态数组指针
    bool modified;  //数组是否被修改,这没啥用
};

/*创建动态数组,参数是数组元素最大个数,返回动态数组指针*/
PDYNINTS create_dynints(int capacity)
{
   
    PDYNINTS di_array = new DYNINTS;
    if (di_array == NULL) {
   
        printf("动态内存分配失败!\n");
        exit(1);
    }

    di_array->capacity = capacity;
    di_array->count = 0;
    di_array->items = NULL;

    return di_array;
}

/*在头部插入元素*/
void insert_head(PDYNINTS di_array, int element)
{
   
    if 
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值