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);
}