- 学会调用写过的函数
- 把插入的元素挂到链表节点下面 形成一个栈节点
- 注意释放内存 节点弹出时释放
栈的实现CPP文件
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"StackLink.h"
//学会调用之前写的函数
StackList* Stack_creat()
{
return Link_creat();//stacklist 和 linklist 都是void类型
}
void Stack_clear(StackList* stack)
{
if (stack == NULL)
{
return;
}
//注意 清空时把之前的元素都弹出去 (释放节点内存)
while (Stack_length(stack) != 0)
{
Stack_pop(stack);
}
return;
}
void Stack_destory(StackList* stack)
{
if (stack == NULL)
{
return;
}
Stack_clear(stack);//先把元素清零
Link_destory(stack);//销毁该链表 当做链表类型销毁
stack = NULL;
}
int Stack_length(StackList* stack)
{
return Link_length(stack);
}
int Stack_push(StackList* stack, void* item)
{
StackNode* tmp = NULL;
tmp = (StackNode*)malloc(sizeof(StackNode));
if (tmp == NULL)
{
printf("error in input for push\n");
return -1;
}
tmp->item = item;//把元素的首地址赋值给成员变量 把变量给挂到节点上
int ret;
ret = Link_insert(stack, (LinkNode*)tmp, 0);//注意 类型转换
if (ret != 0)
{
free(tmp);//注意把分配的地址释放掉
}
return ret;
}
void* Stack_pop(StackList* stack)
{
StackNode* tmp = NULL;
if (stack == NULL)
{
printf("error\n");
return NULL;
}
void* ret = NULL;
StackNode* lnode = NULL;
lnode = (StackNode*)Link_delete(stack, 0);
ret = lnode->item;//传出来地址 缓存到ret中 不是在这个函数里分配的内存定义的变量 还得传出到调用他的函数中
if (lnode != NULL)//注意 释放insert中创建的内存
{
free(lnode);
lnode = NULL;
}
return ret;
}
void* Stack_get(StackList* stack)
{
StackNode* tmp = NULL;
if (stack == NULL)
{
printf("error\n");
return NULL;
}
void* ret = NULL;
StackNode* lnode = NULL;
lnode = (StackNode*)Link_get(stack, 0);
ret = lnode->item;//传出来地址 缓存到ret中 不是在这个函数里分配的内存定义的变量 还得传出到调用他的函数中
return ret;
}
栈的实现头文件
不需要定义头指针 可以用链表的头指针
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"Link.h"
typedef void StackList;
typedef struct StackNode//定义节点
{
LinkNode node;
void* item;
}StackNode;
//typedef struct StackNode//定义栈的头指针 里面需要有长度
//{
// LinkNode next;
// void* item;
//}StackNode;
StackList* Stack_creat();
void Stack_clear(StackList* stack);
void Stack_destory(StackList* stack);
int Stack_length(StackList* stack);
int Stack_push(StackList* stack, void* item);
void* Stack_pop(StackList* stack);
void* Stack_get(StackList* stack);
测试文件
int ret = 0;
Teacher t1, t2, t3, t4, t5;
t1.age = 31;
t2.age = 32;
t3.age = 33;
t4.age = 34;
t5.age = 35;
StackList* stack = NULL;
stack = Stack_creat();
Stack_push(stack, &t1);
Stack_push(stack, &t2);
Stack_push(stack, &t3);
Stack_push(stack, &t4);
Stack_push(stack, &t5);
for (int i = 0;i < 5;i++)
{
void* tmp = Stack_get(stack);
Teacher* tmp_tea = (Teacher*)tmp;//强制类型转换 将节点变量转为老师指针
printf("age=%d\t", tmp_tea->age);
tmp = Stack_pop(stack);
tmp_tea = (Teacher*)tmp;
printf("age=%d\t", tmp_tea->age);
}
Stack_clear(stack);
Stack_destory(stack);