C中的通用数据结构[重复]

2024-01-12

有没有办法在 C 中创建通用数据结构并根据存储的数据类型使用函数,该结构具有各种类型的数据,例如可以根据存储的数据进行打印。

例如,

假设我希望创建一个只存储 float 和 int 的二叉搜索树。自然的方法是创建一个包含 int 和 float 的枚举。它看起来像这样:

Typedef enum {INT, FLOAT} DataType;

Typedef struct node
{
    void *data;
    DataType t;
    struct node *left,
                *right;
}Node;

如果我想打印出来:

void printTree(Node *n)
{
    if (n != NULL)
    {
        if (n->t == INT)
        {
            int *a = (int *) n->data;
            printf("%d ", *a);
        }
        else
        {
            float *a = (float *) n->data;
            printf("%f ", *a);
        }

        printTree(n->left);
        printTree(n->right);
    }
}

没关系,但我想将另一种数据类型存储为堆栈、查询或其他内容。这就是为什么我创建了一个不依赖于特定数据类型的树,例如:

Typedef struct node
{
    void *data;
    struct node *left,
                *right;
}Node;

如果我想打印出来,我使用回调函数,例如:

Node *printTree(Node *n, void (*print)(const void *))
{
    if (n != NULL)
    {
        print(n->data);
        printTree(a->left);
        printTree(a->right);
    }
}

但是当我尝试插入一个整数和一个浮点数并将其打印出来时,它会崩溃。我的问题是,是否有一种方法可以创建通用数据结构,即例程在一种情况下依赖于特定数据类型,但在另一种情况下则不依赖于混合数据类型?在这种情况下,我应该创建一个存储 int 和 float 的结构来存储它,并使用像回调函数中的第一个打印代码中那样的打印函数?

观察:我刚刚在结构中声明了一个节点,并在其上做了一切尝试简化,但想法是将结构与 .h 和 .c 以及所有涉及数据结构的抽象一起使用。


我建议尝试如下操作。你会注意到Node包含一个标记联盟 https://en.wikipedia.org/wiki/Tagged_union允许使用指针类型、整数或浮点数。什么时候Node是指针类型,自定义print函数被调用,在其他情况下,适当的printf使用格式。

typedef enum {POINTER, INT, FLOAT} DataType;

typedef struct node
{
    DataType t;
    union {
        void *pointer;
        int integer;
        float floating;
    } data;
    struct node *left,
                *right;
} Node;

void printTree(Node *n, void (*print)(const void *))
{
    if (n != NULL) {
        switch (n->t) {
            case POINTER:
                print(n->data.pointer);
                break;
            case INT:
                printf("%d ", n->data.integer);
                break;
            case FLOAT:
                printf("%f ", n->data.floating);
                break;
        }
        printTree(a->left, print);
        printTree(a->right, print);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C中的通用数据结构[重复] 的相关文章

随机推荐

  • Java Bean 条件验证

    我有一个具有两个属性的类 我想使用 Java Bean 验证 但遇到一个问题 如何处理 class ProductRequest private String quantityType private double quantityValu
  • 在java中将双精度数分成两部分“整数和分数”的最佳方法是什么

    我尝试通过以下方法分离5 6 例如 private static double method double d int integerPart 0 double fractionPart 0 0 integerPart int d frac
  • 无法使用 ProcessStartInfo 参数将“”传递到 powershell,C#

    我无法将包含以下内容的参数传递给 powershell 当我使用等效代码但将应用程序更改为 cmd 时 都能够通过 我希望 powershell 执行的参数是 Copy Item Path Working Directory W11F as
  • 当业务逻辑和数据层似乎重叠时,分解它们的最佳设计是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在构建一个 MVC Web 应用程序 使用 Spring MVC 框架 并且我对设计特定区域的最佳方法有点困惑 应用程序必须与一系列 Web
  • 具有一个片段的多布局视图页面

    我必须明确的是 我正在寻找一个示例或答案 我可以在视图页面中使用各种不同的布局设计 并且所有页面中的数据都是动态的 并且所有页面都可以由用户交互 我的用例和当前解决问题的方法 所以我有 8 种不同类型的问题类型 所以我创建了layouts对
  • 更新到.net 4.0后wcf回调异常

    我有一个 wcf 服务 它使用 DualHttpBindings 的回调 该服务在找到搜索结果时将其数据表推送回客户端 对于长时间运行的搜索 这在 Net 3 5 中运行良好 自从我更新到 Net 4 0 后 它就抛出了 System Ru
  • 在一个组件视图中完成的更改不会反映在角度 4 中的另一组件视图中

    在这里 我正在更改一个组件中的一些数据 例如 更改一个模块的用户个人资料图片 并且相同的个人资料图片应该反映在其他模块的另一个组件中 这些不是父 子组件 因此我正在导入模块和特定组件 调用组件的函数来分配个人资料图片的范围值 如果我在控制台
  • 与 Superagent 保持连接

    我正在运行一个 node js 服务器 A 它使用 superagent 向另一个服务器 B 发出 HTTP 请求 我调查了服务器 B 上的请求并看到了标头connection being close和 httpVersion 是1 1 v
  • CSS 文本对齐:居中;没有使事物居中

    我有以下 html div ul class links clearfix li class menu 685 menu site map first Site Map li li class menu 686 menu privacy p
  • 如何将 Microsoft Bing 地图导航功能集成到 iPhone 应用程序中?

    我研究过微软必应地图导航 有 iOS 支持和 sdk 可用 http www microsoft com maps developers mobile aspx http www microsoft com maps developers
  • 删除 Vim 中两个括号之间的所有内容,包括换行符

    假设我有以下 python 数组文字 def f arr 1 2 3 我想删除括号中的所有内容 使其变成这样 def f arr 我怎样才能用 vim 中的最少命令来做到这一点 这些是我的一些尝试 Using di 将删除文本 但不会删除空
  • 尝试使用 request.path 设置 Cloud Firestore 安全规则

    我正在努力理解一些 Firestore 安全概念 我想根据以下内容制定一条规则request path财产 我的规则是这样的 service cloud firestore match databases database document
  • 什么是关键路径? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 作为一名开发人员 我有时会在开发执行的背景下遇到 关键路径 这个术语 从维基百科 http en wikipedia org wiki
  • Java:对大型磁盘文件进行随机读取的最快方法

    我有一组相当大的数据 大约 800 MB 左右 这基本上是一些大型的预计算表 我需要将一些计算速度提高几个数量级 创建该文件需要几台多核计算机使用优化的几天才能生成 和多线程算法 我愿意really需要该文件 既然已经计算过一次 那么 80
  • 强制 mdx 查询返回列名

    从 powerpivot 连接到 SSAS 时 我遇到以下问题 如果由于某种原因 mdx 查询没有返回行 也不会返回列名 并且 powerpivot 会给出错误 在 SSMS 中执行此类查询时 如果 mdx 什么也不返回 则得到 0 行 如
  • Android Studio - 找不到 intellij-core.jar

    我使用的是android studio 3 1 4 错误 找不到 intellij core jar com android tools external com intellij intellij core 26 0 1 在以下位置进行了
  • 使用 AngleSharp linq 查询获取 Href 属性

    我想了解如何使用 Anglesharp 我根据示例编写了这段代码 https github com AngleSharp AngleSharp https github com AngleSharp AngleSharp Setup the
  • Android Studio 无需 sdkmanager 安装

    我一直在使用 macOS 10 15 3 在 Flutter 中进行编程 目标是 iOS 设备 今天我也尝试安装 Android Studio 以进行分支 安装没有错误 但是在Library Android sdk 没有tools子目录 这
  • 多流维基百科转储

    我下载了德语维基百科转储 dewiki 20151102 pages articles multistream xml 我的简短问题是 在这种情况下 多流 意味着什么 转储使用 bz2 进行压缩 bz2 支持并行版本 使其能够更快地压缩 解
  • C中的通用数据结构[重复]

    这个问题在这里已经有答案了 有没有办法在 C 中创建通用数据结构并根据存储的数据类型使用函数 该结构具有各种类型的数据 例如可以根据存储的数据进行打印 例如 假设我希望创建一个只存储 float 和 int 的二叉搜索树 自然的方法是创建一