#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct StackNode{
struct StackNode * next;//只维护指针域
};
//栈的链式结构体
struct Lstack{
struct StackNode header;//头结点
int m_size;//栈的大小
};
typedef void* LinkStack;
//初始化栈
LinkStack Init_stack()
{
struct Lstack * stack = (struct Lstack *)malloc(sizeof(struct Lstack));
if (stack == NULL)
{
return NULL;
}
stack->header.next = NULL;
stack->m_size = 0;
return stack;
}
//入栈
void Push_stack(LinkStack stack, void * data)
{
if (stack == NULL)
{
return;
}
if (data == NULL)
{
return;
}
//入栈就是头插法
struct Lstack * mystack = (struct Lstack *)stack;
//把用户数据转换成“挂钩”,就是连接用的指针
struct StackNode * mynode = (struct StackNode *)data;
//插入节点
mynode->next = mystack->header.next;
mystack->header.next = mynode;
mystack->m_size++;
}
//出栈
void Pop_stack(LinkStack stack)
{
if (stack == NULL)
{
return;
}
struct Lstack * mystack = (struct Lstack *)stack;
if (mystack->m_size == 0)
{
return ;
}
//保存第一个有数据的节点——栈顶元素
struct StackNode * pFirst = mystack->header.next;
mystack->header.next = pFirst->next;
mystack->m_size--;
}
//返回栈顶元素
LinkStack Top_stack(LinkStack stack)
{
if (stack == NULL)
{
return NULL;
}
struct Lstack * mystack = (struct Lstack *)stack;
if (mystack->m_size == 0)
{
return NULL;
}
return mystack->header.next;//将第一个有数据的节点返回
}
//返回栈大小
int Size_stack(LinkStack stack)
{
if (stack == NULL)
{
return -1;
}
struct Lstack * mystack = (struct Lstack *)stack;
return mystack->m_size;
}
//判断是否为空
int Isempty_stack(LinkStack stack)
{
if (stack == NULL)
{
return -1;
}
struct Lstack * mystack = (struct Lstack *)stack;
if (mystack->m_size == 0)
{
return 1;
}
return 0;
}
//销毁栈
void Destroy_stack(LinkStack stack)
{
if (stack == NULL)
{
return;
}
free(stack);
stack = NULL;
}
typedef struct person{
struct StackNode node;
char name[40];
int age;
}person;
void test()
{
//prepare datas
person p1 = { NULL, "aaa", 12 };
person p2 = { NULL, "bbb", 13 };
person p3 = { NULL, "ccc", 14 };
person p4 = { NULL, "ddd", 15 };
person p5 = { NULL, "eee", 16 };
//初始化栈
LinkStack stack = Init_stack();
//入栈
Push_stack(stack, &p1);
Push_stack(stack, &p2);
Push_stack(stack, &p3);
Push_stack(stack, &p4);
Push_stack(stack, &p5);
int size = Size_stack(stack);
printf("栈的大小为:%d\n", size);
while (Isempty_stack(stack) == 0)
{
person * pTop = (person *)Top_stack(stack);
printf("姓名是:%s,年龄是:%d\n", pTop->name, pTop->age);
Pop_stack(stack);
}
int size_t = Size_stack(stack);
printf("栈的大小为:%d\n", size_t);
Destroy_stack(stack);
}
int main()
{
test();
return 0;
}
栈的链式存储结构(企业级链表)
最新推荐文章于 2024-07-25 16:56:56 发布