队列可以采用链表的物理结构来实现
当队列的数据个数不明朗的时候建议采用链式队列
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
typedef struct Node {
ElemType data;
struct Node * next;
}QueueNode;
typedef struct {
QueueNode * front;
QueueNode * rear;
}LinkQueue;
//初始化链队列就是讲链队列的首尾指针都指向头结点
Status InitQueue(LinkQueue *Q){
//创建头结点
QueueNode * topNode = (QueueNode *)malloc(sizeof(QueueNode));
if(topNode == NULL){
printf("InitQueue malloc fail\n");
return ERROR;
}
topNode->next = NULL;
//将首尾指针指向头结点
Q->front = topNode;
Q->rear = topNode;
return OK;
}
Status DestoryDueue(LinkQueue *Q){
//需要把头结点一起清空
while(Q->front != NULL){
Q->rear = Q->front->next;
free(Q->front);
Q->front = Q->rear;
}
return OK;
}
Status ClearQueue(LinkQueue *Q){
//把除了头结点之外的结点清空
QueueNode * curNode;
QueueNode * node2free;
//把尾指针指向头结点
Q->rear = Q->front;
curNode = Q->front->next;
while(curNode != NULL){
node2free = curNode;
curNode = curNode->next;
free(node2free);
}
return OK;
}
Status QueueEmpty(LinkQueue Q){
if(Q.front == Q.rear){
return OK;
} else {
return FALSE;
}
}
Status GetHead(LinkQueue Q,ElemType *e){
if(QueueEmpty(Q)){
printf("GetHead error:empty queue\n");
return ERROR;
}
QueueNode * firstNode = Q.front->next;
*e = firstNode->data;
}
Status EnQueue(LinkQueue *Q,ElemType e){
//创建一个新结点
QueueNode * newNode = (QueueNode*)malloc(sizeof(QueueNode));
if(newNode == NULL){
printf("EnQueue error:malloc fail\n");
return ERROR;
}
newNode->data = e;
newNode->next = NULL;
//重置尾指针
Q->rear->next = newNode;
Q->rear = newNode;
return OK;
}
Status DeQueue(LinkQueue *Q,ElemType *e){
if(QueueEmpty(*Q)){
printf("DeQueue error:empty queue\n");
return ERROR;
}
//获取队列首元素
QueueNode * node2free = Q->front->next;
//获取首元素中的值
*e = node2free->data;
//改变队列头指针
Q->front->next = node2free->next;
free(node2free);
return OK;
}
void PrintQueue(LinkQueue Q){
if(QueueEmpty(Q)){
printf("PrintQueue error:empty queue\n");
return;
}
printf("start*****\n");
QueueNode * curNode = Q.front->next;
while(curNode != NULL){
printf("Queue :%d\n",curNode->data);
curNode = curNode->next;
}
printf("end*****\n");
}
int main(){
LinkQueue Q;
InitQueue(&Q);
EnQueue(&Q,1);
EnQueue(&Q,2);
EnQueue(&Q,3);
EnQueue(&Q,4);
EnQueue(&Q,5);
PrintQueue(Q);
int temp;
DeQueue(&Q,&temp);
PrintQueue(Q);
return 0;
}