回顾:泛型数组
本课属于 Coddy C 学习旅程的“面向对象编程”单元。第 53 课,共 61 课。
挑战
简单让我们来构建一个 GenericArray 容器:这是一种灵活的数据结构,可以使用 void* 指针,在同一个集合中存放整数和字符串。
你要将代码分成三个文件:
generic_array.h:定义GenericArray结构体,其中包含三个成员:一个用于存放指针的void**数组、一个用于记录当前数量的int,以及一个用于记录容量的int。声明用于创建数组、添加元素、按索引获取元素和释放数组的函数原型。generic_array.c:实现容器的功能:create_array:根据给定的初始容量分配一个 GenericArray,并将 count 初始化为 0add_element:在下一个可用位置存放一个void*指针,并增加 count(假设容量足够)get_element:返回指定索引处的void*free_array:释放 items 数组和 GenericArray 结构体本身
main.c:通过存放整数和字符串来演示通用数组。读取要添加的元素数量,然后为每个元素读取一个类型标识符(i表示整数,s表示字符串)和对应的值。添加所有元素后,遍历数组并打印每个值。对于整数,直接打印数字;对于字符串,直接打印文本。
程序会收到以下输入:
- 要添加的元素数量
- 每个元素的信息:一个类型标识符(
i或s),后跟对应的值
添加整数时,为 int 分配内存并存储指针。添加字符串时,分配内存并复制字符串。获取元素时,将指针转换回对应的类型再打印。
重要提示:为了在打印时跟踪类型,你可以在 main 中使用一个简单的并行数组来存放类型标识符,也可以将类型标识符字符与每个元素一起存储。
输入为 3,然后依次输入 i 42、s Hello、i 100 时的示例输出:
42
Hello
100输入为 4,然后依次输入 s World、s Generic、i -5、s Arrays 时的示例输出:
World
Generic
-5
Arrays记得在头文件中使用包含保护。容器本身不需要知道自己存储的是什么类型,它只存放 void* 指针。了解类型的责任由添加和获取元素的代码承担。
亲手试试
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "generic_array.h"
int main() {
int n;
scanf("%d", &n);
// TODO:创建容量为 n 的 GenericArray
// TODO:创建一个并行数组来记录类型(大小为 n 的 char 数组)
// TODO:对每个元素:
// 读取类型标识符(i 或 s)
// 读取值
// 如果是整数:为 int 分配内存,存储值,并添加到数组中
// 如果是字符串:为字符串分配内存,复制值,并添加到数组中
// 将类型标识符存入并行数组
// TODO:遍历数组并打印每个元素
// 从并行数组中查看类型
// 将 void* 转换回对应的类型并打印
// TODO:释放所有已分配的内存(整数、字符串和数组)
return 0;
}
面向对象编程中的所有课
自己练习: C 在线编译器