c - 它是 C 语言中的通用堆栈数据结构链表实现吗?

标签 c linked-list stack generic-programming

我的大学教授告诉我们,通用堆栈看起来像这样(我基本上是从类(class)支持文件中复制粘贴的):

typedef struct
{ size_t maxe, dime;  
  char *b, *sv, *vf;  
} TStiva, *ASt;

#define DIME(a) (((ASt)(a))->dime)
#define BS(a) (((ASt)(a))->b)
#define SV(a) (((ASt)(a))->sv)
#define VF(a) (((ASt)(a))->vf)
#define DIMDIF(s,d) (DIME(s) != DIME(d))
#define VIDA(a)  (VF(a) == BS(a))
#define PLINA(a) (VF(a) == SV(a))

// Function Declarations
void* InitS(size_t d,...);
int Push(void* a, void* ae);
int Pop (void* a, void* ae);
int Top (void* a, void* ae);

void *InitS(size_t d,...) 
{ ASt a = (ASt)malloc(sizeof (TStiva));
  va_list ap;
  if (!a) return NULL;
  va_start(ap,d);
  a->maxe = va_arg(ap,size_t);  
  va_end(ap);
  a->dime = d;
  a->b = (char*)calloc(a->maxe, d);         
  if (!a->b) { free(a); return NULL; }     
  a->vf = a->b;  
  a->sv = a->b + d * a->maxe; 
  return (void *)a;
}

int Push(void *a, void *ae)  
{ if( PLINA(a)) return 0;
  memcpy (VF(a), ae, DIME(a)); 
  VF(a) += DIME(a);           
  return 1;
}

int Pop(void *a, void *ae)    
{ if(VIDA(a)) return 0;
  VF(a) -= DIME(a);        
  memcpy (ae, VF(a), DIME(a)); 
  return 1;
}

int Top(void *a, void *ae) 
{ if(VIDA(a)) return 0;
  memcpy (ae, VF(a)-DIME(a), DIME(a));
  return 1;
}

无论如何,这想要的是一个带有 vector 的通用堆栈实现,从中我不明白为什么在Top中,PushPop 函数需要将堆栈数据结构引用为 void *

所谓通用,难道不是意味着数据结构想要保存的值是通用的吗?这意味着,如果您将通用数据结构称为 typedef 而不是 void *,这并不一定意味着它不是通用的。

我问这个问题是因为我即将创建一个用链接列表实现的通用堆栈,但我有点困惑。

这是我的通用链表数据结构:

typedef struct Element {
    struct Element *next;
    void *value;
} TElement, *TList, **AList;

对于堆栈:

typedef struct Stack {
    size_t size;
    TList top;
} TStack, *AStack;

/* Function Definitions */
TStack InitStack(size_t);
void DeleteStack(AStack);
int Push(TStack, void*);
int Pop(TStack, void*);
int Top(TStack, void*);

我的实现中是否有什么东西看起来不通用?

最佳答案

泛型意味着它可以保存任何数据类型(char*int* 等),或包含任何数据类型。 C 中的空指针 void * 允许您按原样转换项目并将这些项目取出(必须在检索时重新转换它们。

因此,它允许程序忽略您的自定义数据结构中的数据类型。

引用结构本身(只要您没有指定所述结构中保存的数据),并不违反一般性。因此,您可以在函数中特别提及您的 TStack,只要在该堆栈内操作的数据是通用的(id est void *).

关于c - 它是 C 语言中的通用堆栈数据结构链表实现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23342338/

相关文章:

C - 移动链表中的节点

c - 如何修复与 C 中的动态数组指针/堆栈相关的崩溃?

stack - 是否有一种编程语言仅具有确定性下推自动机的功能,而仅此而已?

javascript - C 函数到 JavaScript

c++ - #定义一个变量值?预处理指令

c - 如何在没有 GUI 的 Linux 中查看“.db 文件

c - 如何从链表中获取字符串的第一个字符?

c - 在 MacOS 上构建 mongodb C 驱动程序

java - java.util.List 的降序迭代器

c - 未初始化的变量 - 堆栈检查