LinkQueue的C语言实现。数据类型用QElemType
来表示,可以在代码重用时无需再更改,只需巧用typedef
来改个名就可以了,像下面的typedef int QElemType
。下面是完整的代码。
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define TRUE 1
#define FALSE 0
#define ERROR -2
#define OVERFLOW -3
typedef int QElemType;
typedef int Status;
typedef struct QNode {
QElemType 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));
Q.front->next = NULL;
if (Q.front == Q.rear) return OK;
} // InitQueue
Status DestroyQueue(LinkQueue& Q) {
while (Q.front) {
Q.rear = Q.front->next;
free(Q.front);
Q.front = Q.rear;
}
return OK;
} // DestroyQueue, 执行后 Q 不存在.
Status ClearQueue(LinkQueue& Q) {
DestroyQueue(Q);
InitQueue(Q);
if (Q.front == Q.rear) return OK;
} // ClearQueue
Status EmptyQueue(LinkQueue Q) {
if (Q.front == Q.rear) return TRUE;
else return FALSE;
} // EmptyQueue
int QueueLength(LinkQueue Q) {
QueuePtr p;
int i = 0;
for (p = Q.front; p != Q.rear; p = p->next) i++;
return i;
} // QueueLength
Status GetHead(LinkQueue Q, QElemType& e) {
QueuePtr p = Q.front->next;
if (p) {
e = p->data;
return OK;
}
else return ERROR;
} // GetHead
Status EnQueue(LinkQueue& Q, QElemType 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;
} // EnQueue
Status DeQueue(LinkQueue& Q, QElemType& e) {
QueuePtr p = Q.front->next;
if (Q.front == Q.rear) return ERROR;
e = p->data;
Q.front->next = p->next;
if (Q.rear == p) Q.rear = Q.front;
free(p);
return OK;
} // DeQueue
void PrintQueue(LinkQueue Q) {
QueuePtr p = Q.front->next;
for (; p; p = p->next)
printf("%d ", p->data);
printf("\n");
} // PrintQueue