链式栈
#define datatype int
struct stacknode
{
int num; //编号
datatype data; //数据
struct stacknode *pNext; //指针域
};
typedef struct stacknode StackNode; //简化
StackNode * init(StackNode * phead);
StackNode * push(StackNode * phead, int num, datatype data);
StackNode * pop(StackNode * phead, StackNode *poutdata);
StackNode * freeall(StackNode * phead);
StackNode * printall(StackNode * phead);
#include"stacklinknode.h"
#include<stdio.h>
#include<stdlib.h>
StackNode * init(StackNode * phead)
{
return NULL;
}
StackNode * push(StackNode * phead, int num, datatype data)
{
StackNode *pnewnode = (StackNode *)malloc(sizeof(StackNode));
pnewnode->num = num;
pnewnode->data = data;
pnewnode->pNext = NULL;
if (phead == NULL)
{
phead = pnewnode;
}
else
{
StackNode *p = phead;
while (p->pNext != NULL)
{
p = p->pNext;
}
p->pNext = pnewnode;
}
return phead;
}
StackNode * printall(StackNode * phead)
{
if (phead == NULL)
{
return NULL;
}
else
{
printf("%d,%d,%p,%p\n", phead->num, phead->data, phead, phead->pNext);
printall(phead->pNext);
}
}
StackNode * pop(StackNode * phead, StackNode *poutdata)
{
if (phead == NULL)
{
return NULL;
}
else if (phead->pNext == NULL)
{
poutdata->num = phead->num;
poutdata->data = phead->data;
free(phead);
phead = NULL;
return phead;
}
else
{
StackNode *p = phead;
while (p->pNext->pNext != NULL)
{
p = p->pNext;
}
poutdata->num = p->pNext->num;
poutdata->data = p->pNext->data;
free(p->pNext);
p->pNext = NULL;
return phead;
}
}
StackNode * freeall(StackNode * phead)
{
if (phead == NULL)
{
return NULL;
}
else
{
StackNode *p1, *p2;
p1 = phead;
while (p1->pNext != NULL)
{
p2 = p1->pNext;
p1->pNext = p2->pNext;
free(p2);
}
free(phead);
return NULL;
}
}
#include<stdio.h>
#include<stdlib.h>
#include"stacklinknode.h"
void main()
{
StackNode *phead = NULL;
phead = init(phead);
phead = push(phead, 1, 1);
phead = push(phead, 2, 11);
phead = push(phead, 3, 111);
phead = push(phead, 4, 1111);
phead = push(phead, 5, 11111);
printf("进栈之后\n");
printall(phead);
printf("出栈\n");
{
StackNode *pout = (StackNode *)malloc(sizeof(StackNode));
phead = pop(phead, pout);
printf("出栈之后\n");
printall(phead);
printf("出栈之后的数据:%d,%d\n", pout->num, pout->data);
}
system("pause");
}