#include <bits/stdc++.h>
typedef int32_t Elemtype;
typedef struct Node {
Elemtype date;
struct Node* next;
} LinkStack_t, *LinkStack_p;
LinkStack_p CreatStack(void)
{
LinkStack_p newlist = (LinkStack_p)malloc(sizeof(LinkStack_t));
if (newlist == NULL)
return NULL;
newlist->next = NULL;
return newlist;
}
typedef uint8_t S_Status;
#define OK 0
#define SNULL 1
S_Status isNULLStack(LinkStack_p s)
{
return s == NULL ? SNULL : 0;
}
#define SEMPTY 2
S_Status isEmptyStack(LinkStack_p s)
{
return s->next == NULL ? SEMPTY : 0;
}
S_Status (*StackStatusFuc[2])(LinkStack_p) = { &isNULLStack, &isEmptyStack };
void PrintStackStatue(LinkStack_p s)
{
S_Status status = 0;
for (int i = 0; i < 2; i++) {
status = (*StackStatusFuc[i])(s);
printf("%d ", status);
if (status == SNULL)
break;
}
printf("\n");
}
#define ERRORMALLOC 3
S_Status Push(LinkStack_p s, Elemtype *date, void CopyFuc(Elemtype*, const Elemtype*))
{
if (isNULLStack(s))
return SNULL;
LinkStack_p newnode = (LinkStack_p)malloc(sizeof(LinkStack_t));
if (newnode == NULL)
return ERRORMALLOC;
CopyFuc(&newnode->date,date);
newnode->next = s->next;
s->next = newnode;
return 0;
}
S_Status Push_Num(LinkStack_p s,int num,Elemtype *date,void CopyFuc(Elemtype*, const Elemtype*))
{
S_Status status = 0;
while(!(status = (Push(s,date,CopyFuc))) && --num)
{
++date;
}
return status;
}
S_Status Pop(LinkStack_p s,Elemtype *date,void CopyFuc(Elemtype*, const Elemtype*))
{
if(isNULLStack(s)) return SNULL;
if(isEmptyStack(s)) return SEMPTY;
CopyFuc(date,&(s->next->date));
LinkStack_p temp = s->next->next;
free(s->next);
s->next = temp;
return 0;
}
S_Status Pop_Num(LinkStack_p s,int num,Elemtype *date,void CopyFuc(Elemtype*, const Elemtype*))
{
S_Status status = 0;
while(!(status = Pop(s,date,CopyFuc)) && num--)
{
++date;
}
return status;
}
S_Status Pop_All(LinkStack_p s,Elemtype *date,void CopyFuc(Elemtype*, const Elemtype*))
{
S_Status status = 0;
while(!(status = Pop(s,date,CopyFuc)))
{
++date;
}
return status == SEMPTY ? 0 : status;
}
void ElemtypeCopyFuc(Elemtype* dst, const Elemtype* src)
{
*dst = *src;
}
int main(void)
{
Elemtype l_PushDate[5] = {1,2,3,4,5};
Elemtype l_PopDate[5];
LinkStack_p s = CreatStack();
PrintStackStatue(s);
Push_Num(s,5,l_PushDate,ElemtypeCopyFuc);
Pop_Num(s,5,l_PopDate,ElemtypeCopyFuc);
printf("Hello world.\n");
return 0;
}
链式栈的实现
最新推荐文章于 2024-09-27 23:56:15 发布