带头结点队列
有问题可以一起评论区讨论
#include<stdio.h>
#include<malloc.h>
#define _CRT_SECURE_NO_WARNINGS
typedef int ElemType;
typedef struct LinkNode {
ElemType data;
struct LinkNode* next;
}LinkNode;
typedef struct {
LinkNode* front, * rear;
}LinkQueueu;
//初始化队列
void InitQueue(LinkQueueu&);
//入队
void EnQueue(LinkQueueu&, ElemType);
//出队操作
bool DeQueue(LinkQueueu&, ElemType&);
//队列长度
int Length(LinkQueueu);
//遍历队列
void Treaverse(LinkQueueu);
//销毁队列
void DestroyQueue(LinkQueueu&);
int main(void) {
LinkQueueu Q;
InitQueue(Q);
ElemType x;
for (int i = 1; i <= 10; i++) {
EnQueue(Q, i);
}
Treaverse(Q);
printf("队列长度:%d\n", Length(Q));
for (int i = 1; i <= 20; i++) {
if (!DeQueue(Q, x)) {
printf("队列空了\n");
break;
}
}
for (int i = 1; i <= 10; i++) {
EnQueue(Q, i);
}
Treaverse(Q);
DestroyQueue(Q);
printf("队列长度:%d", Length(Q));
return 0;
}
void InitQueue(LinkQueueu& Q) {
Q.front = Q.rear = (LinkNode*)malloc(sizeof(LinkNode));
Q.front->next = NULL;
}
void EnQueue(LinkQueueu& Q, ElemType x) {
LinkNode* node = (LinkNode*)malloc(sizeof(LinkNode));
node->data = x;
node->next = NULL;
Q.rear->next = node;
Q.rear = node;
}
bool DeQueue(LinkQueueu& Q, ElemType& x) {
if (Q.front == Q.rear) {
return false;
}
LinkNode* p = Q.front->next;
x = p->data;
Q.front->next = p->next;
if (p == Q.rear) {
Q.rear = Q.front;
}
free(p);
return true;
}
int Length(LinkQueueu Q) {
if (Q.rear == Q.front) {
return 0;
}
int length = 0;
LinkNode* p = Q.front->next;
while (p != NULL) {
length++;
p = p->next;
}
return length;
}
void Treaverse(LinkQueueu Q) {
LinkNode* p = Q.front->next;
while (p != NULL) {
printf("%d\t", p->data);
p = p->next;
}
printf("\n");
}
void DestroyQueue(LinkQueueu& Q) {
ElemType x;
while (DeQueue(Q, x));
free(Q.front);
Q.front = Q.rear = NULL;
}