头文件 linkStack.h
#ifndef _LINKSTACK_H_
#define _LINKSTACK_H_
#include<stdio.h>
#include<stdlib.h>
typedef int datatype;
typedef struct node{
datatype data; //数据域
struct node *next; //链接指针域
}listnode,*linklist;
linklist linkstack_create(); //创建一个链式栈
int linkstack_empty(linklist s); //判断链式栈是否为空
int linkstack_push(linklist s,datatype data); //元素入栈
datatype linkstack_pop(linklist s); //元素出栈
datatype linkstack_top(linklist s); //求栈顶元素
void linkstack_clear(linklist s); //清空链式栈 ,即只释放结点
void linklist_free(linklist s); //释放链式栈空间,即清空内存
linklist linkstack_create() //创建一个链式栈
{
linklist s;
if((s = (linklist)malloc(sizeof(listnode))) == NULL)
{
printf("malloc failed\n");
return NULL;
}
s->data=0;
s->next=NULL; //s->next一直指向的是栈顶元素
return s;
}
int linkstack_empty(linklist s) //判断链式栈是否为空
{
//1说明为空,0说明不是空的链式栈
return (s->next == NULL ? 1 : 0);
}
int linkstack_push(linklist s,datatype data) //元素入栈
{
linklist p;
if((p = (linklist)malloc(sizeof(listnode))) == NULL)
{
printf("malloc failed!\n");
return -1;
}
p->data=data;
p->next=s->next;
s->next=p;
return 0;
}
datatype linkstack_pop(linklist s) //元素出栈
{
linklist p;
datatype value; //出栈的值
p=s->next; //s->next一直指向的是栈顶元素
s->next=p->next;
value=p->data;
free(p);
p=NULL;
return value;
}
datatype linkstack_top(linklist s) //求栈顶元素
{
return (s->next->data); //因为s->next一直指向的是栈顶元素,s指向头结点
}
void linkstack_clear(linklist s) //清空链式栈,即只释放结点
{
linklist p;
printf("下面开始clear操作:\n");
p=s->next;
while(p!=NULL)
{
s->next=p->next;
printf("%d ",p->data);
free(p);
p=s->next;
}
printf("\n");
}
void linklist_free(linklist s) //释放链式栈空间,即清空内存
{
linklist p;
printf("下面开始释放内存空间\n");
p=s;
while(p!=NULL)
{
s=s->next;
printf("%d ",p->data);
free(p);
p=s;
}
printf("\n");
}
#endif
测试文件 testLinkStack.c
#include "linkStack.h"
int main()
{
linklist s;
int i,n,data;
s=linkstack_create();
printf("请输入你想要输入的元素个数n:\n");
scanf("%d",&n);
printf("下面开始输入n个元素到链式栈中:\n");
for(i=0;i<n;i++)
{
scanf("%d",&data);
linkstack_push(s,data);
}
printf("栈顶元素为:%d\n",linkstack_top(s));
printf("\n===========================\n");
if(linkstack_empty(s))
{
printf("链式栈是空的\n");
}
else
{
printf("开始输出链式栈的内容:\n"); //它和下面的clear只能执行一个,因为出栈后栈内已经为空了
while(!linkstack_empty(s)) //只要链式栈不为空便输出
{
printf("%d ",linkstack_pop(s));
}
printf("\n");
}
printf("\n===========================\n");
linkstack_clear(s); //清空链式栈 ,即只释放结点
printf("\n===========================\n");
linklist_free(s);
return 0;
}