数据结构(链式栈)(C语言)

 利用C语言链表实现栈的基本功能:

  • 头文件:
//LinkStack.h
#ifndef _LINKSTACK_H
#define _LINKSTACK_H

#include <stdio.h>
#include <stdlib.h>

#define SUCCESS 10000
#define FAILURE 10001
#define TRUE    10002
#define FALSE   10003

typedef int Elemtype;

typedef struct node
{
	Elemtype data;
	struct node *next;
}Node;

typedef struct stack
{
	struct node *top;
	int count;
}Stack;

int StackInit(Stack **stack);
int StackEmpty(Stack *stack);
int Push(Stack **stack, Elemtype e);
int GetTop(Stack *stack);
int Pop(Stack **stack);
int StackClear(Stack **stack);
int StackDestory(Stack **stack);

#endif
  • 功能函数: 
//LinkStack.c
#include "LinkStack.h"

int StackInit(Stack **stack)
{
	if(NULL == stack)
	{
		return FAILURE;
	}
	
	*stack = (Stack *)malloc(sizeof(Stack)*1);
	if(NULL == *stack)
	{
		return FAILURE;
	}
	
	(*stack)->top = NULL;
	(*stack)->count = 0;
	
	return SUCCESS;
}

int StackEmpty(Stack *stack)
{
	if(NULL == stack)
	{
		return FAILURE;
	}
	
	return (stack->top == NULL) ? TRUE : FALSE;
}

int Push(Stack **stack, Elemtype e)
{
	if(NULL == stack || NULL == *stack)
	{
		return FAILURE;
	}
	
	Node *p;
	p = (Node *)malloc(sizeof(Node));
	if(NULL == p)
	{
		return FAILURE;
	}
	
	p->data = e;
	p->next = (*stack)->top;
	(*stack)->top = p;
	(*stack)->count++;

	return SUCCESS;	
}

int GetTop(Stack *stack)
{
	if(NULL == stack)
	{
		return FAILURE;
	}
	
	return stack->top->data;
}

int Pop(Stack **stack)
{
	if(NULL == stack || NULL == *stack)
	{
		return FAILURE;
	}
	
	Node *p = (*stack)->top;
	Elemtype e = (*stack)->top->data;
	
	(*stack)->top = (*stack)->top->next;
	(*stack)->count--;
	free(p);
	p = NULL;
	
	return e;
}

int StackClear(Stack **stack)
{
	if(NULL == stack || NULL == *stack)
	{
		return FAILURE;
	}
	
	Node *p;
	
	while((*stack)->top != NULL)
	{
		p = (*stack)->top;
		(*stack)->top = (*stack)->top->next;
		(*stack)->count--;
		free(p);
	}
	return SUCCESS;
}

int StackDestory(Stack **stack)
{
	if(NULL == stack || NULL == *stack)
	{
		return FAILURE;
	}
	
	Node *p;
	
	while((*stack)->top != NULL)
	{
		p = (*stack)->top;
		(*stack)->top = (*stack)->top->next;
		(*stack)->count--;
		free(p);
	}
	
	free(*stack);
	*stack = NULL;
	
	return SUCCESS;
}
  • 测试主函数: 
//Teat.c
#include "LinkStack.h"

int main()
{
	Stack *stack;
	int ret, i;

	ret = StackInit(&stack);
	if(SUCCESS == ret)
	{
		printf("Stack init success!\n");
	}
	else
	{
		printf("Stack init failure!\n");
	}

	ret = StackEmpty(stack);
	if(TRUE == ret)
	{
		printf("Stack is empty.\n");
	}
	else if(FALSE == ret)
	{
		printf("Stack isn't empty.\n");
	}
	else if(FAILURE == ret)
	{
		printf("ERROR!\n");
	}

	for(i = 0; i < 10; i++)
	{
		ret = Push(&stack, i+1);
		if(SUCCESS == ret)
		{
			printf("Stack Push %2d Success.\n", i+1);
		}
		else
		{
			printf("Stack Push Failure.\n");
		}
	}
	
	ret = GetTop(stack);
	if(FAILURE == ret)
	{
		printf("GetTop FAILURE.\n");
	}
	else
	{
		printf("Top is %d.\n", ret);
	}
	
	for(i = 0; i < 5; i++)
	{
		ret = Pop(&stack);
		if(FAILURE == ret)
		{
			printf("Stack Pop Failure.\n");
		}
		else
		{
			printf("Stack Pop %2d Success.\n", ret);
		}
	}

	ret = GetTop(stack);
	if(FAILURE == ret)
	{
		printf("GetTop FAILURE.\n");
	}
	else
	{
		printf("Top is %d.\n", ret);
	}
	
	ret = StackClear(&stack);
	if(FAILURE == ret)
	{
		printf("Stack Clear Failure.\n");
	}
	else
	{
		printf("Stack Clear Success.\n");
	}
	
	ret = StackDestory(&stack);
	if(FAILURE == ret)
	{
		printf("Stack Destory Failure.\n");
	}
	else
	{
		printf("Stack Destory Success.\n");
	}
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/x18261294286/article/details/81568983
今日推荐