首页 > 解决方案 > 如何在 C 中编写一个通用显示函数来显示所有数据类型的 void 指针?

问题描述

我一直在使用 void 指针来实现使用数组的堆栈。我知道,在显示 void 指针指向的值之前,我们需要将其转换为合适的数据类型。

这是我的堆栈结构

typedef struct {
    void **arr;   // array stack
    int size;    // size of the stack
    int top;    // top most element of the stack
    int count; // number of elements in the stack
} stack_T;

假设我现在有一个 int 堆栈(堆栈的内容 -> arr 是数据类型 int )。要显示它的内容,我可以简单地编写一个 display()

void displayIntStack( stack_T *stack ) { 
    while ( !isEmpty( stack )) {
        printf( "%d ", *( int * )stack -> arr[ stack -> top] );
        pop( stack ); 
    }
}

我可以使用它来调用它displayIntStack( stack );,它会显示 int 堆栈的内容。

如果我想实现更通用的 display() 函数来显示所有数据类型的堆栈内容,而无需编写单独的函数。我该怎么做?

标签: cdata-structuresstack

解决方案


如果我想实现更通用的 display() 函数来显示所有数据类型的堆栈内容,而无需编写单独的函数。我该怎么做?

添加一个成员stack_T是执行打印的函数指针。.print()在定义堆栈实例时设置该成员。

typedef struct {
    void **arr;
    int size;
    int top;
    int count;
    int (*print)(void *);
} stack_T;

while (!isEmpty(stack)) {
   stack->print(stack->arr[stack->top]);
   pop(stack); 
}

您可以为通常的嫌疑人提供一组预定义.print()函数。这种方法允许用户为任何类型创建自定义打印功能。int, double


我还希望有一种方法可以在不更改堆栈的情况下将其应用于。.print()stack

进一步:我认为最好的方法是为您的类型形成一个应用函数stack并否定对.print()函数成员的需求:

伪代码

int stack_apply(const stack_T *st, int (*f)(void *state, void *data), void *state) {
  for each node i in the stack
    int result = f(state, stack->arr[i]);
    if (result) return result;
  }
  return 0;
}

现在,当您要打印时:

stack_apply(st, my_print_function, my_print_state);

或者可能是一个搜索函数,或者一个最大值函数,或者一个标准差函数......


推荐阅读