用链式存储实现队列
typdef struct LinkNode{ //链式队列结点
ElemType data;
struct LinkNode *next;
}LinkNode;
typedef struct{ //链式队列
LinkNode *front,*rear; //队列的队头和队尾指针
}LinkQueue;
基本操作
初始化(带头结点)
void InitQueue(LinkQueue &Q){
//初始化时front、rear都指向头结点
Q.front=Q.rear=(LinkNode*)malloc(sizeof(LinkNode));
Q.front->next=NULL;
}
入队
//新元素入队(带头结点)
void EnQueue(LinkQueue &Q,ElemType x){
LinkNode *s=(LinkNode *)malloc(sizeof(LinkNode));
s->data=x;
s->next=NULL;
Q.rear->next=s; //新结点插入到rear之后
Q.rear=s; //修改表尾指针
}
出队
//出队操作
bool DeQueue(LinkQueue &Q,ElemType &x){
if(Q.front==Q.rear){
return false; //空队
}
LinkNode *p=Q.front->next;
x=p->data; //用变量x返回队头元素
Q.front->next=p->next; //修改头结点的next指针
if(Q.rear==p){ //修改rear指针
Q.rear=Q.front;
}
free(p);//释放结点空间
return true;
}
完整代码示例
/**
* 带头结点的链式存储队列
* @author five-five
* @created 2022/5/19
*
*/
#include "stdbool.h"
#include "stdio.h"
#include "stdlib.h"
typedef struct LinkNode {
int data;
struct LinkNode *next;
} LinkNode, *LinkList;
typedef struct LinkQueue {
LinkNode *front; //队头指针
LinkNode *rear; //队尾指针
} LinkQueue;
/**
* 初始化队列
* @param linkQueue 队列指针的指针
* @return true?成功:失败
*/
bool initQueue(LinkQueue **linkQueue) {
(*linkQueue) = (LinkQueue *) malloc(sizeof(LinkQueue));
if (NULL == (*linkQueue)->rear) {
return false;
}
(*linkQueue)->front = (LinkNode *) malloc(sizeof(LinkNode));
(*linkQueue)->front->next = NULL;
(*linkQueue)->rear = (*linkQueue)->front;
return true;
}
/**
* 入队操作
* @param linkQueue 队列的指针
* @param data 入队元素值
* @return true?成功:失败
*/
bool enQueue(LinkQueue *linkQueue, int data) {
if (NULL == linkQueue) {
return false;
}
LinkNode *cur = (LinkNode *) malloc(sizeof(LinkNode));
cur->data = data;
cur->next = NULL;
linkQueue->rear->next = cur;
linkQueue->rear = cur;
return true;
}
/**
* 出队操作
* @param linkQueue 队列的指针
* @param e 入队元素值
* @return true?成功:失败
*/
bool deQueue(LinkQueue *linkQueue, int *e) {
if (NULL == linkQueue || linkQueue->front == linkQueue->rear) {
return false;
}
LinkNode *frontNext = linkQueue->front->next;
*e = frontNext->data;
linkQueue->front->next = frontNext->next;
if (frontNext == linkQueue->rear) {
linkQueue->rear = linkQueue->front;
}
free(frontNext);
return true;
}
int main() {
LinkQueue *linkQueue = NULL;
int e =-1;
initQueue(&linkQueue);
deQueue(linkQueue, &e);
printf("%d\n", e);
enQueue(linkQueue, 1);
enQueue(linkQueue, 2);
enQueue(linkQueue, 3);
enQueue(linkQueue, 4);
deQueue(linkQueue, &e);
printf("%d\n", e);
deQueue(linkQueue, &e);
printf("%d\n", e);
deQueue(linkQueue, &e);
printf("%d\n", e);
deQueue(linkQueue, &e);
printf("%d\n", e);
return 1;
}