int栈
typedef struct{
int* elems;
int logicallen;//当前元素个数
int alloclength;//最大容量
}stack;
void StackNew(stack* s);
void StackDespose(stack* s);
void StackPush(stack* s,int value);
int StackPop(stack* s);
stack.c
void StackNew(stack *s)
{
s->loglength=0;
s->alloclength=4;
s->elems=malloc(4*sizeof(int));
assert(s->elems!=NULL;
}
void StackDispose(stack *s)
{
free(s->elems);
//不能写free(s),因为s不完全是动态分配的
}
void StackPush(stack *s,int value)
{
if(s->loglength==s->alloclength)
{
s->alloclength*=2;
s->elems=realloc(s->elems,s->alloclength*sizeof(int));
assert(s->elems!=NULL);
}
s->elems[s->loglenth]=value;
s->loglenth++;
}
int StackPop(stack *s)
{
assert(s->loglenth>0);
s->loglenth--;
return s->elems[s->loglength];
}
stack s;
StackNew(&s);
for(int i=0;i<5;i++)
{
StackPush(&s,i);
}
SatckDispose(&s);
void StackNew(stack *s)
{
s->logicallen=0;
s->alloclen=4;
s->elems=malloc(4*sizeof(int));
assert(s->elems!=NULL);
}
泛型栈
typedef struct{
void* elems;
int elemSize;//元素大小不知道
int logicallen;//当前元素个数
int alloclength;//最大容量
}stack;
void StackNew(stack* s,int elemSize);
void StackDespose(stack* s);
void StackPush(stack* s,void* elemAddr);
int StackPop(stack* s,void* elemAddr);
stack.c
void StackNew(stack *s,int elemSize)
//s应该按引用传递
{
assert(s->elemSize>0);
s->loglength=0;
s->alloclength=4;
s->elems=malloc(4*elemSize);
assert(s->elems!=NULL;
}
void StackDispose(stack *s)
{
free(s->elems);
//不能写free(s),因为s不完全是动态分配的
}
void StackPush(stack *s,void *elemAddr)
{
if(s->loglength==s->alloclength)
{
StackGrow(s);
}
void* target=(char* )s->elems+s->loglength*s->elemSize;
//void指针不能做算数运算所以要先转为char*(unsigned long*也行)再转void*
memcpy(target,elemAddr,s->elemSize);
s->loglength++;
}
static void StackGrow(stack *s)
{
s->alloclength*=2;
s->elems=realloc(s->elems,s->alloclength*sizeof(int));
assert(s->elems!=NULL);
}
int StackPop(stack *s,void * elemAddr)
{
void* source=(char*)s->elems+(s->loglength-1)*s->elemSize
memcpy(elemAddr,source,s->elemSize);
s->loglength--;
}