链式队列的实现方式

C语言实现链队列

LinkQueue.h

//
// Created by Administrator on 2024/8/17.
//

#ifndef LINKQUEUE_H
#define LINKQUEUE_H

#include <stdbool.h>

/** 定义队列元素结构体*/
typedef int DataType;
typedef struct LinkQueueNode {
    DataType data; //数据域
    struct LinkQueueNode *next; //指针域
} LkQueNode;

/** 定义队列结构体*/
typedef struct LkQueue{
    LkQueNode *front; //头指针,指向链队头结点
    LkQueNode *rear;  //尾指针,指向链队最后一个结点
} LkQue;

//队列初始化
void initQueue(LkQue *LQ);

//判断队列是否为空
bool EmptyQueue(LkQue *LQ);

//入队列
void EnQueue(LkQue *LQ, DataType x);

//出队列
void OutQueue(LkQue *LQ);

//输出队列首元素
void GetHead(LkQue *LQ);

//输出队列所有元素
void PrintEle(LkQue *LQ);

#endif //LINKQUEUE_H

LinkQueue.c

//
// Created by Administrator on 2024/8/17.
//
#include "LinkQueue.h"
#include <stdio.h>
#include "stdbool.h"
#include <stdlib.h>

//队列初始化
void initQueue(LkQue *LQ) {
    //生成队列头结点并分配动态空间
    LkQueNode *temp = (LkQueNode *) malloc(sizeof(LkQueNode));
    //队列头指针指向队列头结点
    LQ->front = temp;
    //队列尾指针指向队列尾结点
    LQ->rear = temp;
    //头结点指向的指针域为空
    (LQ->front)->next = NULL;
}

//判断队列是否为空
bool EmptyQueue(LkQue *LQ) {
    if (LQ->front == LQ->rear) {
        return true;
    }
    return false;
}

//入队列
void EnQueue(LkQue *LQ, DataType x) {
    //创建新结点并分配动态空间
    LkQueNode *temp = (LkQueNode *) malloc(sizeof(LkQueNode));
    //新结点temp的数据域存放输入的元素
    temp->data = x;
    //新结点temp的指针域设置为空
    temp->next = NULL;

    //将新结点temp插入到链队最后一个结点
    (LQ->rear)->next = temp;
    LQ->rear = temp;
    printf("元素 %d 入队成功!\n",x);
}

//出队列
void OutQueue(LkQue *LQ) {
    //声明结点temp存放队头结点数据
    LkQueNode *temp;
    //判断链队是否为空
    if (EmptyQueue(LQ)) {
        printf("队空");
    } else {
        //队头数据存放到结点temp
        temp = (LQ->front)->next;
        //修改头结点的指针域指向新的首结点,链队当中剩余数据向前移动
        (LQ->front)->next = temp->next;
        //链队当中仅有一个元素时,front和rear都指向头结点
        if (temp->next == NULL) {
            LQ->rear = LQ->front;
            printf("出队成功,出队元素为:%d\n", temp->data);
            //释放结点temp空间
            free(temp);
        }
        printf("出队成功,出队元素为:%d\n", temp->data);
    }
}

//输出队列首元素
void GetHead(LkQue *LQ) {
    //判断链队是否为空
    if (EmptyQueue((LQ))) {
        printf("队空");
    } else {
        //队列非空,返回队列首结点元素
        printf("队首元素为: %d\n", LQ->front->next->data);
    }
}

//输出队列所有元素
void PrintEle(LkQue *LQ) {
    printf("队列元素为:");
    LkQueNode *p;
    //判断链队是否为空
    if (EmptyQueue((LQ)))
        printf("队空");
    //头结点数据存放到结点p中
    p = LQ->front;
    //依次存放,直到头结点指针域为空结束
    while (p->next != NULL) {
        p = p->next;
        printf("%d ", p->data);
    }
    printf("\n");
}

main.c

void TestLinkQueue() {
    LkQue S;
    initQueue(&S);

    DataType a[5]={2,4,6,8,10};
    for (int i=0;i<5;i++) {
        EnQueue(&S,a[i]);
    }
    PrintEle(&S);

    OutQueue(&S);

    GetHead(&S);
}

程序运行图

image

posted @   相遇就是有缘  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
  1. 1 我记得 赵雷
  2. 2 北京东路的日子 汪源
  3. 3 把回忆拼好给你 王贰浪
我记得 - 赵雷
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

Not available

点击右上角即可分享
微信分享提示