参考《大话数据结构》:
环境:ubuntu16.04 vim
文件名称:linkstack.h linkstack.c main.c Makefile(放到同一个目录下)
实现功能:链栈的初始化,入栈,出栈
1.linkstack.h头文件
#ifndef __LINKSTACK_HEAD__
#define __LINKSTACK_HEAD__
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 20
#define OK 0
#define ERROR -1
#define TRUE 1
#define FALSE 0
typedef int ElemType;
typedef int Status;
/*单链表的存储结构*/
typedef struct StackNode
{
ElemType data;
struct StackNode *next;
}StackNode, *LinkStackPtr;
typedef struct LinkStack
{
LinkStackPtr top;
int count;
}LinkStack;
/*
*对链栈进行初始化
*s [IN, OUT]进行操作的链栈
*/
extern void InitLinkStack(LinkStack *s);
/*
*插入元素e为新的栈顶元素
*s [IN, OUT]进行操作的链栈
*e [IN]插入到节点的数据
*/
extern Status Push(LinkStack *s, ElemType e);
/*
*删除栈顶元素,并将其值返回
*s [IN, OUT]进行操作的链栈
*e [IN, OUT]返回的被删除的栈顶元素
*/
extern Status Pop(LinkStack *s, ElemType *e);
#endif
2.linkstack.c文件
#include "linkstack.h"
/*初始化链栈*/
void InitLinkStack(LinkStack *s)
{
s->top = NULL;
s->count = 0;
}
/*插入元素e为新的栈顶元素*/
Status Push(LinkStack *s, ElemType e)
{
LinkStackPtr p = NULL;
p = (LinkStackPtr)malloc(sizeof(StackNode));
if (!s)
{
printf("malloc failed!\n");
return ERROR;
}
p->data = e;
p->next = s->top; //把当前栈顶元素赋值给新结点的直接后继
s->top = p; //将新的结点s赋值给栈顶指针
s->count++;
return OK;
}
/*若栈不空,则删除s的栈顶元素,用e返回其值,成功返回OK,否则返回ERROR*/
Status Pop(LinkStack *s, ElemType *e)
{
LinkStackPtr p;
if (s->count == 0)
{
printf("链栈为空!\n");
return ERROR;
}
*e = s->top->data; //将栈顶结点赋值给p
p = s->top; //使得栈顶指针下移一位,指向后一节点
s->top = s->top->next;
free(p);
p = NULL;
s->count--;
return OK;
}#include "linkstack.h"
int main()
{
LinkStack s;
InitLinkStack(&s);
if (Push(&s, 3))
{
printf("Push failed!\n");
return ERROR;
}
printf("s.top->data:%d\n", s.top->data);
ElemType e = 0;
if (Pop(&s, &e))
{
printf("Pop failed!\n");
return ERROR;
}
printf("e:%d\n", e);
Pop(&s, &e);
return OK;
}
3.main.c文件
#include "linkstack.h"
int main()
{
LinkStack s;
InitLinkStack(&s);
if (Push(&s, 3))
{
printf("Push failed!\n");
return ERROR;
}
printf("s.top->data:%d\n", s.top->data);
ElemType e = 0;
if (Pop(&s, &e))
{
printf("Pop failed!\n");
return ERROR;
}
printf("e:%d\n", e);
Pop(&s, &e);
return OK;
}
4.Makefile文件
#Makefile for building programmings
OBJS=linkstack.o main.o
CC=gcc
CFLAGS=-Wall -g
TARGET=linkstack
TARGET:$(OBJS)
$(CC) $(OBJS) -o $(TARGET)
linkstack.o:linkstack.c linkstack.h
$(CC) $(CFLAGS) -c $< -o $@
main.o:main.c linkstack.h
$(CC) $(CFLAGS) -c $< -o $@
.PHONY:clean
clean:
rm *.o linkstack
5.运行结果