Math Dash的链栈程序

栈的出栈与入栈如图:

链栈定义:

typedef struct
{
	int id;
	char password[300];
}Elemtype;
typedef struct
{
	Elemtype data;//*数据域
	struct StackNode *next;.//*指针域
}StackNode,*LinkStack;//*指向StackNode

初始化:

void InitStack(LinkStack *a)
{
	*a=NULL;//*将结点置空
}

入栈:

入栈就是在栈顶插入新元素

void Pop(LinkStack *a,Elemtype b)
{
	LinkStack c;
	c=(StackNode*)malloc(sizeof(StackNode));//*为新结点分配内存
	c->data=b;//*将b赋值给新结点的数据域
	c->next=*a;//*将新结点插入站定
	*a=c;//*修改栈顶指针为c
	printf("入栈成功!\n");//*提示入栈成功!
}

出栈:

出栈就是在栈顶删除新元素

void GetTop(LinkStack *a)
{
	if(!(*a))//*如果链栈为空
	{
		printf("链栈空!\n");
		return;
	}
	LinkStack b;
	b=*a;//*保存旧链栈
	*a=(*a)->next;//*修改栈顶指针
	free(b);//*释放旧链栈空间
	printf("出栈成功!\n");//*显示出栈成功!
}

取栈顶元素:

void PutsStack(LinkStack *a)
{
	if(!(*a))//*如果链栈为空
	{
		printf("无信息\n");
		return;
	}
	printf("id:%d\tpassword:%s\n",(*a)->data.id,(*a)->data.password);//*显示栈顶信息
}

完整代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
	int id;
	char password[300];
}Elemtype;
typedef struct
{
	Elemtype data;
	struct StackNode *next;
}StackNode,*LinkStack;
void InitStack(LinkStack *a)
{
	*a=NULL;
}
void Push(LinkStack *a,Elemtype c)
{
	LinkStack b;
	b=(StackNode*)malloc(sizeof(StackNode));
	b->data=c;
	b->next=*a;
	*a=b;
}
void Windows_system()
{
	LinkStack *a;
	InitStack(&a);
	for(;;)
	{
		printf("1.入栈\n2.出栈\n3.取栈顶元素\n4.退出\n");
		char b[300];
		for(;;)
		{
			gets(b);
			if((strcmp(b,"1")==0)||(strcmp(b,"2")==0)||(strcmp(b,"3")==0)||(strcmp(b,"4")==0))
			{
				break;
			}
			else if(strlen(b)==0)
			{
				printf("内容不能为空!");
			}
			else
			{
				printf("输入错误!");
			}
			printf("请重新输入,重新输入的内容为:");
		}
		if(strcmp(b,"1")==0)
		{
			Elemtype c;
			GetsStack(&c);
			Pop(&a,c);
		}
		if(strcmp(b,"2")==0)
		{
			GetTop(&a);
		}
		if(strcmp(b,"3")==0)
		{
			PutsStack(&a);
		}
		if(strcmp(b,"4")==0)
		{
			return;
		}
		system("pause");
	}
}
void Windows_name_system()
{
	char a[]="Math Dash的链栈程序";
	char b[strlen(a)+6];
	sprintf(b,"title %s",a);
	system(b);
	puts(a);
}
void PutsStack(LinkStack *a)
{
	if(!(*a))
	{
		printf("无信息\n");
		return;
	}
	printf("id:%d\tpassword:%s\n",(*a)->data.id,(*a)->data.password);
}
void GetsStack(Elemtype *a)
{
	char b[300],c[300];
	printf("请输入id\n");
	for(;;)
	{
		gets(b);
		int d,e;
		d=strlen(b);
		for(e=0;e<strlen(b);e++)
		{
			if((!isdigit(b[e]))||(strlen(b)>6))
			{
				break;
			}
		}
		if(e<d)
		{
			printf("输入错误!");
		}
		else if(strlen(b)==0)
		{
			printf("内容不能为空!");
		}
		else
		{
			break;
		}
	}
	printf("请输入password\n");
	for(;;)
	{
		gets(c);
		if(strlen(c)==0)
		{
			printf("内容不能为空!");
		}
		else if(strlen(c)>20)
		{
			printf("密码长度过长!");
		}
		else
		{
			break;
		}
		printf("请重新输入,重新输入的内容为:");
	}
	a->id=atoi(b);
	strcpy(a->password,c);
}
void Pop(LinkStack *a,Elemtype b)
{
	LinkStack c;
	c=(StackNode*)malloc(sizeof(StackNode));
	c->data=b;
	c->next=*a;
	*a=c;
	printf("入栈成功!\n");
}
void GetTop(LinkStack *a)
{
	if(!(*a))
	{
		printf("链栈空!\n");
		return;
	}
	LinkStack b;
	b=*a;
	*a=(*a)->next;
	free(b);
	printf("出栈成功!\n");
}
void f()
{
	long a;
	a=time(NULL);
	Windows_name_system();
	Windows_system();
	long b;
	b=time(NULL);
	printf("用时:%ld天%ld时%ld分%ld秒\n",(b-a)/(3600*24),((b-a)/3600)%24,((b-a)/60)%60,(b-a)%60);
	system("pause");
}
main()
{
	f();
	return 0;
}

程序运行结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值