c语言创建链式队列,并且完成相关功能
编译软件为vs2022
代码如下
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct Qnode{//链队列里任意节点的结构
int data;
struct Qnode* next;
}Qnode,*QueuePtr;
typedef struct //链式队列的整体描述
{
QueuePtr front;//队头
QueuePtr rear;//队尾
}LinkQueue;
void PrintQueue(LinkQueue* Q);
void InitQueue(LinkQueue*Q)//初始化队列
{
Q->front = Q->rear = (QueuePtr)malloc(sizeof(Qnode));
if (!Q->front)
{
printf("初始化失败\n");
exit(0);
}
Q->front->next = NULL;
printf("初始化成功\n");
}
void InsertQueue(LinkQueue* Q) //入队
{
QueuePtr p;
printf("请输入入队元素的个数:\n");
int x;
scanf("%d", &x);
int num;
for (int i = 1; i <= x; i++)
{
p = (QueuePtr)malloc(sizeof(Qnode));
printf("请输入第%d个元素:\n",i);
scanf("%d", &num);
p->data = num;
p->next = NULL;
Q->rear->next = p;//插入队尾
Q->rear = p;//更新尾部指针
}
PrintQueue(Q);
}
int Isempty(LinkQueue* Q) //判空
{
if (Q->front == NULL && Q->rear == NULL) {
return 1;//传值1为空
}
else
return 0;//传值0为非空
}
void PrintQueue(LinkQueue* Q)//遍历打印
{
if (Isempty(Q))
{
printf("队列为空\n");
exit(0);
}
QueuePtr p = Q->front->next; // 临时节点
printf("当前队列为:");
while (p != NULL) // 遍历直到 p 为空
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int LengthQueue(LinkQueue* Q)//求队列长度
{
if (Isempty(Q))
{
return 0;
}
QueuePtr p;
int flag = 0;
p = Q->front->next;//设p为首元节点
while (p)//p存在即循环,p指向null则结束
{
p = p->next;
flag++;
}
return flag;
}
void GetQueue1(LinkQueue* Q)//查找元素的位置
{
if (Isempty(Q))
{
printf("队列为空\n");
exit(0);
}
int num;
printf("请输入查找的元素:\n");
scanf("%d", &num);
QueuePtr p;
int flag = 1;
p = Q->front->next;//p为首元节点
while (p)//p存在即遍历
{
if (p->data == num)
{
printf("元素%d在队列的第%d位\n", p->data,flag);
break;
}
flag++;
p = p->next;
}
printf("该元素不在当前队列中!\n");
}
void GetQueue2(LinkQueue*Q)//查找位置的元素
{
if (Isempty(Q))
{
printf("队列为空\n");
exit(0);
}
int num;
printf("请输入查找的位置:\n");
scanf("%d", &num);
QueuePtr p;
int flag = 1;
p = Q->front->next;//p为首元节点
int length = LengthQueue(Q);
if (num <= 0|| num>length)
{
printf("位置输入不合法\n");
}
while (p)
{
if (flag == num)
{
printf("第%d位的元素为%d\n", flag, p->data);
break;
}
flag++;
p = p->next;
}
}
void DelQueue(LinkQueue* Q)//出队
{
if (Isempty(Q))
{
printf("队列为空\n");
exit(0);
}
QueuePtr p;//定义临时节点
p = Q->front->next;
if (p == Q->rear)//如果首元节点=队尾,就清空
Q->rear = Q->front;
int e;
e = p->data;
Q->front->next = p->next;//把首元节点赋值成首元节点的下一个节点
free(p);
printf("删除的元素是%d\n", e);
}
void DestroyQueue(LinkQueue* Q)//销毁队列
{
while (Q->front) {
Q->rear = Q->front->next;
free(Q->front);
Q->front = Q->rear;
}
}
int OperateMenu(LinkQueue* Q) {
int choice;
char a[10];
int flag;
do {
printf("**************************************************************\n");
printf("请选择操作:\n");
printf("0、退出\n");
printf("1、入队\n");
printf("2、出队\n");
printf("3、遍历打印\n");
printf("4、判断队是否为空\n");
printf("5、销毁队\n");
printf("6、求队长\n");
printf("7、输入元素查找位置\n");
printf("8、输入位置查找元素\n");
printf("**************************************************************\n");
printf("请输入操作:\n");
scanf("%d", &choice);
switch (choice) {
case 0:
exit(0);//退出
break;
case 1:
InsertQueue(Q);//入队
break;
case 2:
DelQueue(Q);//出队
break;
case 3:
PrintQueue(Q);//遍历打印
break;
case 4:
if (Isempty(Q))//判空操作
printf("队列为空\n");
else
printf("队列非空\n");
break;
case 5:
DestroyQueue(Q);//销毁队列
break;
case 6:
if (LengthQueue(Q) == 0)//求长度
printf("队列为空,长度为%d\n", LengthQueue(Q));
else
printf("队列长度为%d\n", LengthQueue(Q));
break;
case 7:
GetQueue1(Q);//查找元素的位置
break;
case 8:
GetQueue2(Q);//查找位置的元素
}
printf("是否要继续进行操作\n");
printf("请输入YES or NO\n");
scanf("%s", a);
if (strcmp(a, "yes") == 0 || strcmp(a, "Yes") == 0 || strcmp(a, "YES") == 0) {
printf("好的!\n");
}
else if (strcmp(a, "no") == 0 || strcmp(a, "No") == 0 || strcmp(a, "NO") == 0) {
exit(0);
}
else {
break;
}
} while (choice != 0);
}
int main()
{
LinkQueue Q;
InitQueue(&Q);
OperateMenu(&Q);
return 0;
欢迎讨论与指点