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

被折叠的 条评论
为什么被折叠?



