我的大學教授告訴我們,一般堆棧看起來是這樣的(我基本上從課程支持文件複製粘貼此):是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;
}
不管怎麼說,這要成爲一個通用的堆棧實現與矢量,從中我不明白爲什麼Top
,Push
和Pop
函數需要將堆棧數據結構稱爲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*);
做任何事情似乎不是通用在我的執行?
您將要'Pop'和'Top'採取'void **',因此您可以爲調用者提供指向數據的指針。由於您不知道數據有多大,因此您不能對提供的指針執行「memcpy」操作。 –
必須抵制...抱怨...關於宏觀濫用。嗯 – this
我完全讓你在那裏。我有同樣的感覺。我複製粘貼從課程支持。 –