.C环境下的链式队列创建及其相关功能

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;

欢迎讨论与指点

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北京最后的深情

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值