动态数组库功能设计
静态数组一经创建大小不能改变。动态数组更灵活,可以在程序运行时根据需要指定数组大小。
利用C语言实现抽象数据类型(ADT)的方法C语言实现抽象数据类型(ADT),实现动态数组数据类型。
这个动态数组功能有:
- 从头部插入元素;从尾部插入元素;根据下标访问、插入、删除元素等。
- 可用回调函数遍历动态数组。
以下是头文件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
源文件、具体实现
- 这里是用memcpy内存复制函数进行动态数组更新的。其函数原型为
void *memcpy(void *destin, void *source, unsigned n)
,要注意参数填写正确。我记得我第一次写的时候把函数指针运算的结果和地址概念搞错了:假设p是一个T *
类型的指针,而n是一个整型变量或常量,那么p+n
是一个类型为T *
类型的指针变量,它指向的地址是p + n × sizeof(T)
。填入memcpy的前两个参数应该是指针变量。有时有的书上会把指针、指针变量、地址混起来说,比较容易混淆。指针可以等价于地址,指针变量是存储地址的变量。但经常把指针变量P直说成指针P。 - 回调函数是个好东西,在测试程序中简单用个输出函数来测试回调函数遍历动态数组的。
- 我是用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