#include <stdio.h>
#include <stdlib.h>
typedef struct LinkNode {
int data;
LinkNode* next;
}*LinkNodePtr;
typedef struct LinkQueue {
LinkNodePtr front;
LinkNodePtr rear;
}*LinkQueuePtr;
//初始化一个空队列
LinkQueuePtr initQueue() {
LinkQueuePtr resultPtr = new struct LinkQueue;
LinkNodePtr headerPtr = new struct LinkNode;
headerPtr->next = NULL;
resultPtr->front = headerPtr;
resultPtr->rear = headerPtr;
return resultPtr;
}
//输出函数
void outputLinkQueue(LinkQueuePtr paraQueuePtr) {
LinkNodePtr tempPtr = paraQueuePtr->front->next;
while (tempPtr!=NULL)
{
printf("%d ", tempPtr->data);
tempPtr = tempPtr->next;
}
printf("\r\n");
}
void enqueue(LinkQueuePtr paraQueuePtr, int paraElement) {
//step1.Create a new node.
LinkNodePtr tempNodePtr = new struct LinkNode;
tempNodePtr->data = paraElement;
tempNodePtr->next = NULL;
//step2.Link to the existing rear.
paraQueuePtr->rear->next = tempNodePtr;
//step3.It is the rear.
paraQueuePtr->rear = tempNodePtr;
}
int dequeue(LinkQueuePtr paraQueuePtr) {
int resultValue;
LinkNodePtr tempNodePtr;
//step1.Is the queue empty?
if (paraQueuePtr->front == paraQueuePtr->rear) {
printf("The queue is empty.\r\n");
return -1;
}
//step2.Change the queue.
tempNodePtr = paraQueuePtr->front->next;
resultValue = tempNodePtr->data;
paraQueuePtr->front->next=tempNodePtr->next;
//当队列中只有一个节点时,删除后,rear==front
if (paraQueuePtr->rear == tempNodePtr) {
paraQueuePtr->rear = paraQueuePtr->front;
}
//step3.Free space.
tempNodePtr = NULL;
//step4.Return.
return resultValue;
}
void testLinkQueue() {
LinkQueuePtr tempQueuePtr;
tempQueuePtr = initQueue();
enqueue(tempQueuePtr, 10);
enqueue(tempQueuePtr, 30);
enqueue(tempQueuePtr, 50);
outputLinkQueue(tempQueuePtr);
printf("dequeue gets %d\r\n", dequeue(tempQueuePtr));
printf("dequeue gets %d\r\n", dequeue(tempQueuePtr));
printf("dequeue gets %d\r\n", dequeue(tempQueuePtr));
printf("dequeue gets %d\r\n", dequeue(tempQueuePtr));
enqueue(tempQueuePtr, 8);
outputLinkQueue(tempQueuePtr);
}
int main() {
testLinkQueue();
return 0;
}
链队列的特点:先进先出
链队列有两个指针:front指向头结点,rear指向最后一个节点。
入队操作:创建一个新节点p存储入队元素,rear->next=p,rear=p。
出队操作:创建一个节点p指向队列的第一个节点,p=front->next,front->next=p->next,需要注意的是如果只有一个节点时,出队后,rear=front,两个指针都指向头结点。