C语言实现的链表栈结构

#include"stdlib.h"
//栈是一种先进后出的结构,如果用顺序存储结构来实现,进来的元素插入尾端
//出去的元素从尾端删除,由于顺序结构可以随机访问,比较容易实现。
//如果用链表来实现,会增大额外的指针开销,进来的元素插入头端,出去的元素从头端删除
//两者入栈和出栈的时间复杂度都为常数,链表的内存开销更大。
//链表不用考虑边界问题,这里采用链表实现。
typedef void data;//data为栈中存入的数据
typedef struct datanode{
unsigned int* value;
struct datanode* next;
}datanode;
typedef struct _stack{
datanode* top;//指向栈顶(链表头)
datanode* base;//指向栈底(链表尾)
}*stack,_stack;

void printobj(unsigned int* obj);

stack init()
{
stack tmpstack = (stack)malloc(sizeof(_stack));
if (tmpstack == NULL){ return NULL; }
tmpstack->base = NULL;
tmpstack->top = NULL;
return tmpstack;
}

datanode* createnode(data* value)
{
datanode* tmp = (datanode*)malloc(sizeof(datanode));
if (tmp == NULL){ return NULL; }
tmp->value = (unsigned int)value;
tmp->next = NULL;
return tmp;
}

void push(stack stackobj, data* value)
{
if (stackobj == NULL){ return; }
datanode* tmp = createnode(value);
if (tmp == NULL){ return ; }
tmp->next = stackobj->top;
stackobj->top = tmp;
if (tmp->next == NULL)
{
stackobj->base = tmp;//其实这个base没什么卵用,只是标准的栈结构有base,就给他做一个
}
}
//出栈,通过returnvalue返回值
data* pop(stack stackobj)
{
if (stackobj == NULL){ return; }
if (stackobj->top == NULL)//栈为空
{
return NULL;
}
datanode* tmp = stackobj->top;
stackobj->top = stackobj->top->next;
return tmp->value;
}

data* gettop(stack stackobj)
{
if (stackobj == NULL){ return; }
if (stackobj->top == NULL)//栈为空
{
return NULL;
}
return stackobj->top->value;
}

void printstack(stack stackobj)
{
if (stackobj == NULL){ return; }
datanode* tmp = stackobj->top;
while (tmp!= NULL)
{
printobj(tmp->value);//必须要写一个存入数据的printobj()函数
tmp = tmp->next;
}
}

typedef struct apple{
int num;
char* color;
}apple;

void printobj(data* obj)
{
apple* tmp = (apple*)obj;
printf("%d个%s苹果\n",tmp->num,tmp->color);
}

void main(){
apple apple1,apple2;
apple1.num = 10;
apple1.color = “red”;
apple2.num = 20;
apple2.color = “pink”;
stack mystack = init();
push(mystack,(data*)&apple1);
push(mystack,(data*)&apple2);
printstack(mystack);
apple* p=(apple*)pop(mystack);
printstack(mystack);
printf("%d %s\n", ((apple*)p)->num, ((apple*)p)->color);
system(“pause”);
}

//为了能够存放任何数据类型,将data定义为void,方便指针转换。

猜你喜欢

转载自blog.csdn.net/weixin_40677431/article/details/82936031