导航

struct_to_binary_rw_demo.c 文件测试文档

发布时间:8 months ago 更新时间:4 months ago
开发

[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 代码中,最重要的就是链表的设计和一个忽略数据类型的想法,其他的操作都是大同小异。