#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW 3
typedef int Status;
typedef int Element;
typedef struct QNode {
Element data;
struct QNode* next;
}QNode,*QueuePtr;
typedef struct {
QueuePtr front;
QueuePtr rear;
}LinkQueue;
Status InitQueue(LinkQueue& Q) {
Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));
if (!Q.front)exit(OVERFLOW);
Q.front->next = NULL;
return OK;
}
Status DestoryQueue(LinkQueue& Q) {
while(Q.front) {
Q.rear = Q.front->next;
free(Q.front);
Q.front= Q.rear;
}
return OK;
}
Status EnQueue(LinkQueue& Q, Element e) {
QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
if (!p) exit(OVERFLOW);
p->data = e;
p->next = NULL;
Q.rear->next = p;
Q.rear = p;
return OK;
}
Status DeQueue(LinkQueue& Q, Element &e) {
if (Q.front == Q.rear)exit(OVERFLOW);
QNode* p = Q.front->next;
if (p==Q.rear) {
Q.rear = Q.front;
}
else {
e = p->data;
Q.front->next = p->next;
}
free(p);
return OK;
}
Status ClearQueue(LinkQueue& Q) {
QNode* p = Q.front->next;
while (p)
{
p->data = NULL;
p = p->next;
}
free(p);
return OK;
}
Status QueueEmpty(LinkQueue& Q) {
if (Q.front!=Q.rear) {
return ERROR;
}
return TRUE;
}
int QueueLength(LinkQueue& Q) {
if (Q.front == Q.rear)return 0;
QNode* p = Q.front->next;
int length = 0;
while (p) {
length++;
p = p->next;
}
free(p);
return length;
}
Status GetHead(LinkQueue& Q,Element &e) {
if (Q.front == Q.rear)exit(OVERFLOW);
e = Q.front->next->data;
return OK;
}
int main() {
LinkQueue Q;
InitQueue(Q);
EnQueue(Q, 5);
EnQueue(Q, 6);
Element e;
printf("%d\n", QueueLength(Q));
GetHead(Q, e);
printf("%d\n",e);
DeQueue(Q, e);
printf("%d\n", e);
printf("%d\n", QueueLength(Q));
GetHead(Q, e);
printf("%d\n", e);
printf("%d\n", QueueEmpty(Q));
DeQueue(Q, e);
printf("%d\n", QueueEmpty(Q));
printf("%d\n", QueueLength(Q));
EnQueue(Q, 5);
EnQueue(Q, 6);
ClearQueue(Q);
GetHead(Q, e);
printf("%d\n", e);
printf("%d", DestoryQueue(Q));
return 0;
}
C语言数据结构-队列(链队列)
于 2024-07-02 21:30:08 首次发布