繁体   English   中英

它是C中的通用堆栈数据结构链接列表实现吗?

[英]Is It A Generic Stack Data Structure Linked List Implementation in C?

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

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;
}

无论如何,这是一个带有向量的通用堆栈实现,我不理解为什么在TopPushPop函数中需要将堆栈数据结构称为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 * )。

void*是出于一般目的。 想象一下它是指向内存的指针,当然内存可以容纳任何东西。 void*是指您不知道所指的是什么,但是您知道您指向的是某物。

是的, void*可以正确实现通用堆栈,但是这会产生一个问题,使您对堆栈中存储的数据类型一无所知。 void*的概念是它指向某个有效的内存块,但是绝对没有关于内存类型的线索。 因此,使用此通用堆栈的代码必须显式进行类型转换。 void*仅用于存储数据,不允许对其进行操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM