数据结构-链栈(C语言实现)

226 阅读4分钟
  • 头文件
#ifndef STACK_H_INCLUDED
#define STACK_H_INCLUDED

typedef enum Status 
{
    ERROR = 0, 
	SUCCESS = 1
} Status;

typedef int ElemType;

typedef  struct StackNode
{
	ElemType data;
	struct StackNode *next;
}StackNode, *LinkStackPtr;

typedef  struct  LinkStack
{
	LinkStackPtr top;
	int	count;
}LinkStack;

//链栈
Status initLStack(LinkStack *s);//初始化栈

Status isEmptyLStack(LinkStack *s);//判断栈是否为空

Status getTopLStack(LinkStack *s);//得到栈顶元素

Status clearLStack(LinkStack *s);//清空栈

Status destroyLStack(LinkStack *s);//销毁栈

Status LStackLength(LinkStack *s);//检测栈长

Status pushLStack(LinkStack *s);//入栈

Status popLStack(LinkStack *s);//出栈

void TraverseStack(LinkStack* s);

void checkinput(int* r);

#endif 
  • 函数定义
#include"LinkStack.h"
#include <stdio.h>
#include <stdlib.h>

Status initLStack(LinkStack* s)
{
	s->top = (LinkStackPtr)malloc(sizeof(StackNode));
	s->top->next = NULL;
	s->count = 0;
	return SUCCESS;
}

Status isEmptyLStack(LinkStack* s)
{
	if (!s->top) {
		printf("\n请先输入【1】创建链栈!\n");
		return ERROR;
	}
	else if (s->count == 0) {
		printf("\n这是一个空链栈!\n");
		return SUCCESS;
	}
	else {
		printf("\n这不是一个空链栈!\n");
		return ERROR;
	}
}

Status getTopLStack(LinkStack* s)
{
	if (!s->top) {
		printf("\n请先输入【1】创建链栈!\n");
		return ERROR;
	}
	else if (s->count == 0) {
		printf("\n这是一个空链栈!\n");
		return ERROR;
	}
	else {
		printf("\n栈顶元素为:%d\n", s->top->next->data);
		return SUCCESS;
	}
}

Status clearLStack(LinkStack* s)
{
	if (!s->top) {
		printf("\n请先输入【1】创建链栈!\n");
		return ERROR;
	}
	else if (s->count == 0) {
		printf("\n这是一个空链栈!\n");
		return ERROR;
	}
	else {
		LinkStackPtr ptem, p = s->top->next;
		while (p) {
			ptem = p->next;
			free(p);
			p = ptem;
		}
		s->count = 0;
		printf("\n链栈清空成功\n");
		return SUCCESS;
	}
}

Status destroyLStack(LinkStack* s)
{
	if (!s->top) {
		printf("\n请先输入【1】创建链栈!\n");
		return ERROR;
	}
	while (s->top) {
		LinkStackPtr p = (LinkStackPtr)malloc(sizeof(StackNode));
		p = s->top->next;
		free(s->top);
		s->top = p;
		s->count--;
		if(!s->top)
		printf("\n链栈销毁成功\n");
	}
}

Status LStackLength(LinkStack* s)
{
	if (!s->top) {
		printf("\n请先输入【1】创建链栈!\n");
		return ERROR;
	}
	else if (s->count == 0) {
		printf("\n这是一个空链栈!\n");
		return ERROR;
	}
	else {
		printf("\n链栈长度为:%d\n", s->count);
		return SUCCESS;
	}
}

Status pushLStack(LinkStack* s)
{
	if (!s->top) {
		printf("\n请先输入【1】创建链栈!\n");
		return ERROR;
	}
	else {
		StackNode* p;
		p = (StackNode*)malloc(sizeof(StackNode));
		printf("\n请输入你的数据:\n");
		checkinput(&(p->data));
		p->next = s->top->next;
		s->top->next = p;
		s->count++;
		printf("\n入栈成功\n");
		TraverseStack(s);
		return SUCCESS;
	}
}

Status popLStack(LinkStack* s)
{
	if (!s->top) {
		printf("\n请先输入【1】创建链栈!\n");
		return ERROR;
	}
	else if (s->count == 0) {
		printf("\n这是一个空链栈!\n");
		return ERROR;
	}
	else {
		LinkStackPtr ptem, p = s->top->next;
		ptem = p->next;
		free(p);
		s->top->next = ptem;
		s->count--;
		printf("\n出栈成功\n");
		TraverseStack(s);
		return SUCCESS;
	}
}

void TraverseStack(LinkStack* s)
{
	if (!s->top) {
		printf("\n请先输入【1】创建链栈!\n");
		return;
	}
	else if (s->count == 0) {
		printf("\n这是一个空链栈!\n");
		return;
	}
	else {
		LinkStackPtr p = s->top->next;
		printf("\n链栈为:\n\n【top】 <-");
		while (p) {
			printf("【%d】 <- ", p->data);
			p = p->next;
		}
		printf("【bottom】\n\n");
		printf("\n现在链栈长度为:%d\n", s->count);
		return;
	}
}

void checkinput(int* r) {
	int error = 0, i = 0;
	char c[50] = { 0 };
	do {
		gets(c);
		error = 0;
		for (i = 0; c[i] != '\0'; i++) {
			if (i == 0 && c[i] == '-')
			{
				continue;
			}
			if (c[i] < '0' || c[i]>'9')
				error = 1;
		}
		if (error) printf("输入错误,请重新输入!\n");
	} while (error);
	*r = atoi(c);
}
  • 函数实现
#include"LinkStack.h"
#include <stdio.h>
#include <stdlib.h>
int main() {
	int i, num,sizes;
	int* length = (int*)malloc(sizeof(int));
	ElemType data = 0;
	ElemType* e = (ElemType*)malloc(sizeof(ElemType));
	LinkStack* s = (LinkStack*)malloc(sizeof(LinkStack*));
	s->top = NULL;
	while (1) {
		system("cls");
		printf("\t\t\t|----------------------------------|\n");
		printf("\t\t\t|           链栈基本操作           |\n");
		printf("\t\t\t|----------------------------------|\n");
		printf("\t\t\t|      1---创建链栈                |\n");
		printf("\t\t\t|      2---判断是否为空            |\n");
		printf("\t\t\t|      3---得到栈顶元素            |\n");
		printf("\t\t\t|      4---清空链栈                |\n");
		printf("\t\t\t|      5---销毁链栈                |\n");
		printf("\t\t\t|      6---获取栈长                |\n");
		printf("\t\t\t|      7---压栈                    |\n");
		printf("\t\t\t|      8---出栈                    |\n");
		printf("\t\t\t|      9---遍历输出                |\n");
		printf("\t\t\t|      10---退出                   |\n");
		printf("\t\t\t|----------------------------------|\n");
		printf("\t\t\t|                  前端-Sheldonlee |\n");
		printf("\t\t\t|----------------------------------|\n");
		printf("\n请选择操作:\n");
		checkinput(&num);
		if (num >= 1 && num <= 10) {
			switch (num) {
			case 1: {
				if (s->top != NULL) {
					printf("\n已存在一个链栈,请先销毁此栈!\n");
				}
				else {
					printf("请输入你的顺序栈长度:");
					initLStack(s);
					checkinput(&sizes);
					if (sizes>= 0) {
						for (i = 0; i < sizes; i++) {
							pushLStack(s);
						}
						printf("\n链栈创建成功\n");
					}
					else {
						printf("\n链栈初始化失败,长度输入错误!\n");
					}
				}
				break;
			}
			case 2: {
				isEmptyLStack(s);
				break;
			}
			case 3: {
				getTopLStack(s);
				break;
			}
			case 4: {
				clearLStack(s);
				break;
			}
			case 5: {
				destroyLStack(s);
				break;
			}
			case 6: {
				LStackLength(s);
				break;
			}
			case 7: {
				pushLStack(s);
				break;
			}
			case 8: {
				popLStack(s);
				break;
			}
			case 9: {
				TraverseStack(s);
				break;
			}
			case 10:
				destroyLStack(s);
				system("cls");
				printf("\n\n\n\n\n\n\n\t\t\t\t尚有很多不足之处,望多多指教!\n\n\n\n\n\n\n");
				exit(0);
				break;
			}
		}
		else
		{
			printf("\n请输入正确的数字。\n");    //错误提醒
		}
		system("pause");
	}
	return 0;
}