[TOC]
struct_to_binary_rw_demo.c 文件测试文档
因为是远古时期笔记的远古,有些内容丢失了,后续会补上,最重要的是想法,是面向计算机编程的想法。顺着这个思路走的话,很容易理解我说的话,不需要图片去辅助。
测试目的
因为结构体数据类型在内存中是一段连续的空间类似与数组,所以我想能不能通过一个 char
的数组(在实际的代码中我使用的 void),用以忽略类型的问题:
在开发的场景中,我会有多个结构体,去构成链表,且都要对链表进行操作,也就是说,如果我定义了 3 个结构体,那么我就需要单独的对这三个结构体都声明一个链表。又因为链表的非一致性,我还需要重新编写对于链表的操作函数,这样未免太过于繁琐。 于是我开始尝试新的方式,用以解决保存不同类型的数据,最终的方式还是返璞归真,回到计算机的底层二进制。在 Go 语言中有一个 byte
类型,用以存储 8 bit 的数据。通过这个思想,于是便有了 Demo 中的代码
架构
链表结构
链表使用的单向,链表的结构定义如下:
/* >--------链表结构体--------< */
typedef struct Node *PtrToNode;
typedef PtrToNode Position;
typedef struct Link *LinkList;
struct Node {
void *Data;
PtrToNode Next;
};
// 链表定义
struct Link {
size_t Len;
Position Node;
Position EndNode;
};
我们从链的节点开始,首先节点定义的是一个 void *Data
,用以动态适应数据的长度。并且能够更加快速的传递给结构体。在 main
函数后段,对文件进行读取的时候,你就能看到 void
的妙用。
Next
就不必多说了。我设计的链表定义了一个 Dummy Node(哑节点),哑节点包含有三个域:
-
Len
:记录每个节点中data
的长度,这样设计- 方便快速读取文件
- 对 Data 分配内存时更加方便
- 防止溢出
-
Node
:这个才是真正的链表开头 -
EndNode
:链表的尾端
在这里还没有考虑构建树的时间,如果考虑到构建树的时间,我准备采用二分的方式来进行链表节点的插入。
所以链表的结构如下:
表头中的 Node
始终指向链开头,EndNode
始终指向链的最后一个节点。这样设计的原因是因为,我想通过不同的链构建不同的树,如下(结合两张图查看):
整个 demo 代码中,最重要的就是链表的设计和一个忽略数据类型的想法,其他的操作都是大同小异。