2.3栈的链式结构

参考《大话数据结构》:

环境: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.运行结果



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值