先简单聊聊
上次以顺序存储的方式实现了队列,今天我们用链式存储的方式,实现以下。
直接上代码
准备代码
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20
typedef int Status;
typedef int QElemType;
typedef struct QNode{
QElemType data;
struct QNode *next;
}QNode, *QueuePtr;
typedef struct {
QueuePtr front;
QueuePtr rear;
}LinkQueue;
主要代码
//初始化
Status initQueue(LinkQueue *queue) {
//head
queue->rear = queue->front = (QueuePtr)malloc(sizeof(QNode));
if (!queue->front && !queue->rear) {
return ERROR;
}
queue->front->next = NULL;
return OK;
}
//销毁
Status destoryQueue(LinkQueue *queue) {
while (queue->front) {
//销毁队列,队尾指针rear已经没有用了,把他当做临时指针用
queue->rear = queue->front->next;
free(queue->front);
queue->front = queue->rear;
}
return OK;
}
//清空
Status clearQueue(LinkQueue *queue) {
QueuePtr p,q;
queue->rear = queue->front;
p = queue->front->next;
queue->front->next = NULL;
while (p) {
q = p;
p = p->next;
free(q);
}
return OK;
}
//是否为空
Status queueEmpty(LinkQueue queue) {
if (queue.front == queue.rear) {
return TRUE;
} else {
return FALSE;
}
}
//长度
int queueLength(LinkQueue queue) {
int i = 0;
QueuePtr p;
p = queue.front;
while (p != queue.rear) {
i++;
p = p->next;
}
return i;
}
//入队
Status enteyQueue(LinkQueue *queue, QElemType elem) {
QueuePtr temp = (QueuePtr)malloc(sizeof(QNode));
if (!temp) {
return ERROR;
}
temp->data = elem;
temp->next = NULL;
queue->rear->next = temp;
queue->rear = temp;
return OK;
}
//出队
Status outQueue(LinkQueue *queue, QElemType *elem) {
if (queueEmpty(*queue)) {
return ERROR;
} else {
QueuePtr p = queue->front->next;
*elem = p->data;
queue->front->next = p->next;
if (queue->rear == p) {
queue->rear = queue->front;
}
free(p);
return OK;
}
}
Status getHead(LinkQueue queue, QElemType *elem) {
if (queue.front != queue.rear) {
*elem = queue.front->next->data;
return TRUE;
} else {
return FALSE;
}
}
//遍历
Status traverseQueue(LinkQueue queue) {
QueuePtr p;
p = queue.front->next;
while (p) {
printf("%d ",p->data);
p = p->next;
}
return OK;
}
调用
int main(int argc, const char * argv[]) {
// insert code here...
printf("Hello, World!\n");
LinkQueue queue;
Status iStatus = initQueue(&queue);
if (iStatus) {
printf("init OK\n");
}
printf("is empty? %d\n", queueEmpty(queue));
printf("queue length:%d\n", queueLength(queue));
enteyQueue(&queue, 1);
enteyQueue(&queue, 2);
enteyQueue(&queue, 3);
printf("is empty? %d\n", queueEmpty(queue));
printf("queue length:%d\n", queueLength(queue));
traverseQueue(queue);
QElemType elem;
getHead(queue, &elem);
printf("get head elem:%d\n", elem);
iStatus = outQueue(&queue, &elem);
if (iStatus == OK) {
printf("del elem:%d\n", elem);
}
getHead(queue, &elem);
printf("get head elem:%d\n", elem);
clearQueue(&queue);
destoryQueue(&queue);
return 0;
}
打印
