链队列的基本操作

这个博客展示了如何使用链栈实现链队列,并提供了包括初始化、判断队列空、进队、出队、持续出队和销毁队列等操作的C语言代码实现。用户可以通过选择菜单进行交互操作。
#define _CRT_SECURE_NO_WARNINGS//链栈
#include <stdio.h>
#include <malloc.h>

//全局定义特殊变量
#define ok 1

//转定义区域
typedef char SElemType;
typedef int status;

typedef struct QNode
{
	SElemType data;
	struct QNode* next;

}QNode,*QueuePtr;

void Interrupt()//中断函数//用于检测换行符,使函数脱离scanf的连续输出 
{
	while (1)
	{
		if (getchar() == '\n')
		{
			break;
		}
	}
}

typedef struct 
{
	QueuePtr front;
	QueuePtr rear;

}LinkNode;

status InitQueue(LinkNode& Q)//队列的初始化
{
	Q.front=Q.rear= (QNode*)malloc(sizeof(QNode));
	Q.front->next = NULL;
	return ok;
}

void Packfun1(LinkNode& Q)
{
	int i;
	i = InitQueue(Q);
	if (i = 1)
	{
		printf("初始化成功!");
	}
	else
	{
		printf("初始化失败!");
	}
}

status QueueEmpty(LinkNode& Q)
{
	if (Q.front = Q.rear)
	{
		printf("队空!\n");
	}
	else
	{
		printf("非空队!\n");
	}
	return ok;
}

status EnQueue(LinkNode& Q, SElemType e)//进队操作
{
	QNode* p;
	p= (QNode*)malloc(sizeof(QNode));
	p->data = e;
	p->next = NULL;
	Q.rear->next = p;
	Q.rear = p;//归位
	return ok;
}

void Packfun2(LinkNode& Q)
{
	int i;
	SElemType e;
	printf("请输入要进队的值:");
	Interrupt();
	scanf("%c", &e);
	i = EnQueue(Q, e);
	if (i = 1)
	{
		printf("进队成功!");
	}
	else
	{
		printf("进队失败!");
	}
}



status DeQueue(LinkNode& Q, SElemType &e)//出队操作
{
	QNode* p;
	if (Q.front == Q.rear)
	{
		return 0;
	}
	p = Q.front->next;
	e = p->data;
	Q.front->next = p->next;
	if (Q.rear == p)
	{
		Q.front = Q.rear;
	}
	free(p);
	return ok;
}

void Packfun3(LinkNode& Q)//一直出队
{
	SElemType e;
	printf("出队的顺序为:");
	while (Q.front!=Q.rear)
	{
		DeQueue(Q,e);
		printf("  %c", e);
	}
}

void DestroyQueue(LinkNode& Q)
{
	QNode* p = Q.front->next;
	while (Q.front != Q.rear)
	{
		Q.front->next = p->next;
		free(p);
		p = Q.front->next;
	}
	printf("队列已销毁!\n");
}

int main()
{
	int a, f = 0, i = 0;
	LinkNode Q;
	SElemType e;
	while (1)
	{
		printf("\n");
		printf("================================\n");
		printf("|        链队列的操作系统       |\n");
		printf("================================\n");
		printf("|        1.初始化队列           |\n");
		printf("|        2.判断队列是否为空     |\n");
		printf("|        3.进队                 |\n");
		printf("|        4.出队                 |\n");
		printf("|        5.持续出队             |\n");
		printf("|        6.销毁队列             |\n");
		printf("|        0.退出队列操作系统     |\n");
		printf("================================\n");
		printf("请选择功能(0-5):");
	mark:scanf("%d", &a);
		switch (a)
		{
		case 0:f = 1; break;
		case 1: Packfun1(Q); break;
		case 2: QueueEmpty(Q); break;
		case 3: Packfun2(Q); break;
		case 4: DeQueue(Q, e); printf("出队的元素为:%c", e); break;
		case 5: Packfun3(Q);  break;
		case 6: DestroyQueue(Q); break;
		default:printf("选择功能错误!请重新选择菜单功能:"); goto mark;
		}
		if (f == 1)
		{
			printf("已经退出系统");
			break;//该break是为了退出while的无限“菜单”循环
		}
	}
}

使用的编译环境是vs2019,源文件后缀是.cpp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值