C实现的泛型栈
2014-02-28 11:41
543 查看
typedef struct{
void *elems; //栈底指针
int loglen; //已经使用的长度
int alloclen; //已经申请的长度
int elemSize; //单个元素的长度
}stack;
void StackNew(stack *s, int elemSize)
{
assert(elemSize > 0);
s->elemSize = elemSize;
s->loglen = 0;
s->alloclen = 4;
s->elems = malloc(4 *elemSize);
assert(s->elems != NULL);
}
void StackPush(stack *s, void *elemAdd)
{
//栈满则采用加倍策略增长
if (s->loglen == s->alloclen)
{
StackGrow(s);
}
void *target = (char *)(s->elems) + loglen * (s->elemSize);
memcpy(target, elemAdd, s->elemSize);
s->loglen++;
}
static void StackGrow(stack *s)
{
s->alloclen *= 2;
s->elems = realloc(s->elems, (s->alloclen) * (s->elemSize));
}
void StackPop(stack *s, void *elempop)
{
//获取栈顶元素指针
void *source = (char*)(s->elems) + (s->loglen - 1 ) *(s->elemSize);
memcpy(elempop, source, s->elemSize);
s->loglen--;
}
void *elems; //栈底指针
int loglen; //已经使用的长度
int alloclen; //已经申请的长度
int elemSize; //单个元素的长度
}stack;
void StackNew(stack *s, int elemSize)
{
assert(elemSize > 0);
s->elemSize = elemSize;
s->loglen = 0;
s->alloclen = 4;
s->elems = malloc(4 *elemSize);
assert(s->elems != NULL);
}
void StackPush(stack *s, void *elemAdd)
{
//栈满则采用加倍策略增长
if (s->loglen == s->alloclen)
{
StackGrow(s);
}
void *target = (char *)(s->elems) + loglen * (s->elemSize);
memcpy(target, elemAdd, s->elemSize);
s->loglen++;
}
static void StackGrow(stack *s)
{
s->alloclen *= 2;
s->elems = realloc(s->elems, (s->alloclen) * (s->elemSize));
}
void StackPop(stack *s, void *elempop)
{
//获取栈顶元素指针
void *source = (char*)(s->elems) + (s->loglen - 1 ) *(s->elemSize);
memcpy(elempop, source, s->elemSize);
s->loglen--;
}
相关文章推荐
- 关于C语言中参数的传值问题
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- 探讨C语言的那些小秘密之断言
- 深入探讨C语言中局部变量与全局变量在内存中的存放位置
- 基于C语言fflush()函数的使用详解
- 关于C语言除0引发的思考
- 深入分析C中不安全的sprintf与strcpy
- 探讨register关键字在c语言和c++中的差异
- C中实现矩阵乘法的一种高效的方法
- c语言printf函数的使用详解
- C语言学籍管理系统源代码
- 浅析C语言中的sizeof
- c语言内存泄露示例解析
- 浅析C语言位域和位段
- 解析C语言中位字段内存分配的问题
- 学生成绩管理系统C语言代码实现
- 基于C语言sprintf函数的深入理解
- C语言中函数声明与调用问题
- 基于malloc与free函数的实现代码及分析