参考《大话数据结构》:
环境: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文件4.Makefile文件#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; }
5.运行结果#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