#include <stdio.h>
#include <stdlib.h>
//队列数据结构的定义
//插入、删除
//判断空、非空
typedef struct Qnode { //先定义数据结点
int data;
struct Qnode *next;
} Qnode, *QueuePtr;
typedef struct {
QueuePtr front;
QueuePtr rear;
} LinkQueue;
void InitQueue(LinkQueue &Q);
void DestoryQueue(LinkQueue &Q); //不保留头结点
void ClearQueue(LinkQueue &Q); //保留头结点
int QueueEmpty(LinkQueue Q);
int QueueLength(LinkQueue Q);
void GetHead(LinkQueue Q, int &e); //返回队头元素
void EnQueue(LinkQueue &Q, int e); //入队
void DeQueue(LinkQueue &Q, int &e); //出队
void QueueTraverse(LinkQueue Q, void(*Visit)(int));
void EnQueue(LinkQueue &Q, int e) {
QueuePtr newbase = (QueuePtr)malloc(sizeof(Qnode));
if (!newbase)
return;
//队尾插入
newbase->data = e;
newbase->next = NULL;
//原队尾指针指向的结点指向新结点(1队尾元素指向新节点)
Q.rear->next = newbase;
//队尾指针指向新节点 (2队尾指针指向新结点)
Q.rear = newbase;
}
void DeQueue(LinkQueue &Q, int &e) {
QueuePtr temp; //结点指针
if (Q.front == Q.rear)
return;
temp = Q.front->next; //1 temp指向首元结点
e = temp->data;
//2 Q.front->next 指向首元结点后结点
Q.front->next = temp->next;
if (Q.rear == temp) //若尾指针和temp指向了同一结点
Q.rear = Q.front; //队列就为空了
free(temp); //3释放首元结点
}
void InitQueue(LinkQueue &Q) {
Q.front = Q.rear = (QueuePtr)malloc(sizeof(Qnode));
if (!Q.front)
return;
Q.front->next = NULL;
}
void DestoryQueue(LinkQueue &Q) {
while (!Q.front) {
Q.rear = Q.front->next;
free(Q.front);
Q.front = Q.rear;
}
}
void ClearQueue(LinkQueue &Q) {
Q.rear = Q.front->next; //队尾指针指向首元结点
while (Q.rear) {
Q.front->next = Q.rear->next;
free(Q.rear);
Q.rear = Q.front->next ;
}
}
int QueueEmpty(LinkQueue Q) {
//链式队列空的条件 队头指针和队尾指针指向同一块结点
if (Q.front == Q.rear)
return 1;
return 0;
}
int QueueLength(LinkQueue Q) {
int count = 0;
QueuePtr temp = Q.front;
while (temp != Q.rear) {
count++;
temp = temp->next;
}
return count;
}
void GetHead(LinkQueue Q, int &e) {
QueuePtr temp;
if (Q.front == Q.rear) //若是空队列
return;
temp = Q.front->next; //指向首元结点
e = temp->data;
}
void QueueTraverse(LinkQueue Q, void(*Visit)(int)) {
QueuePtr temp;
temp = Q.front->next;
while (temp) {
Visit(temp->data);
temp = temp->next;
}
printf("\n");
}
void visit(int e) {
printf("%d", e);
}
int main() {
LinkQueue Q;
int k, length, temp, head;
InitQueue(Q);
k = QueueEmpty(Q);
if (k > 0) {
for (int i = 0; i < 6; i++) {
EnQueue(Q, i * 2);
}
}
QueueTraverse(Q, visit);
length = QueueLength(Q);
printf("length=%d\n", length);
DeQueue(Q, temp);
printf("De_temp=%d\n", temp);
GetHead(Q, head);
printf("GetHead = %d\n", head);
QueueTraverse(Q, visit);
return 0;
}