3

我正在使用二叉搜索树数据结构来对一系列具有类型定义的结构进行排序:

typedef struct {
    char c;
    int index;
} data_t;

typedef struct node node_t;

typedef node {
    void *data;
    node_t *left;
    node_t *right;
}

node_t typedef 来自为此目的提供给我的库,可能带有 void* 指针以确保多态性。 node将被传递到函数中:

static void *recursive_search_tree(node_t *root, void *key, int cmp(void*,void*))

在 recursive_search_tree 函数中,我希望能够修改代码以使用索引元素作为条件来找到最接近线性传递的索引的匹配字符数组,这最终将涉及传递到的 data_t*keykey->index在函数内访问。

问题

是否可以访问key->indexkeyvoid*指向结构的位置,或者只有在声明为 key 的类型时data_t才有可能?data_t我试图做后者,但是即使将指针转换为 int 似乎也没有通过编译器。

4

2 回答 2

3

当然有可能,你会强制转换key为 type *data_t。(只要那是真正的key指向!)

key                     /* argument of type void* */
(data_t*)key            /* cast as type data_t*   */
((data_t*)key)->index   /* dereferenced */

这是一个简单的例子:

#include <stdlib.h>
#include <stdio.h>

typedef struct {
    char    c;
    int     index;
} data_t;

typedef struct node {
    void    *data;
    struct node *left;
    struct node *right;
} node_t;

static int cmp(void *lhs, void *rhs)
{
    return ((data_t *)lhs)->index - ((data_t *)rhs)->index;
}

int main(void)
{
    data_t d0;
    data_t d1;

    d0.c     = 'A';
    d0.index = 1;
    d1.c     = 'B';
    d1.index = 2;

    printf("d0 < d1? %s\n", (cmp((void *)&d0, (void *)&d1) < 0 ? "yes" : "no"));
    printf("d1 < d0? %s\n", (cmp((void *)&d1, (void *)&d0) < 0 ? "yes" : "no"));

    return EXIT_SUCCESS;
}
于 2012-10-21T05:39:26.043 回答
0

这是类型不安全的,任何使用 void 也是如此。使用 void 通常是因为中间人持有一些它不为他人方便而使用的东西。这是一个 C 函数,可让您在树中保存您想要的任何内容。它所做的只是返回你给它的任何指针。

在您的搜索功能中

int cmp(void* dt1, void* dt2)
{
data_t*  data1 = (data_t*)dt1;
data_t*  data2 = (data_t*)dt2;
/* Do what you need with data1 and data2 here */
}

应该让你为所欲为。您遇到的问题是您需要在函数内转换您的值。cmp 的参数应该与您正在使用的库的 API 完全匹配,其中参数为 void*。

于 2012-10-21T05:47:37.253 回答