所谓队列的链式存储结构是用一个线性链表来表示一个队列,队列中每一个元素对应链表中一个链结点,这样的队列简称链接队列。具体地说,把线性链表第1个链结点的指针定义为队头指针front,在链表最后的链结点建立指针rear作为队尾指针,并且限定只能在链头进行删除操作,在链尾进行插入操作,这个线性链表就构成了一个链接队列。另一个与顺序存储结构队列的不同点是,队头指针与队尾指针都是指向实际队头元素与队尾元素所在的链结点。
主要设计如下:
- LinkQueuePtr initQueue():初始化一个链式队列。
- void outputLinkQueue(LinkQueuePtr paraQueuePtr):打印链式队列中的元素。
- void enqueue(LinkQueuePtr paraQueuePtr, int paraElement):队列入队操作(尾插法)。
- int dequeue(LinkQueuePtr paraQueuePtr):队列出队操作。
/**
* The Nodes of LinkQueue.
*/
typedef struct LinkNode {
int data;
LinkNode *next;
} *LinkNodePtr;
/**
* The LinkQueue.
*/
typedef struct LinkQueue {
LinkNodePtr front;
LinkNodePtr rear;
} *LinkQueuePtr;
完整代码设计如下:
//
// Created by A on 2023/4/24.
//
#include <iostream>
using namespace std;
/**
* The Nodes of LinkQueue.
*/
typedef struct LinkNode {
int data;
LinkNode *next;
} *LinkNodePtr;
/**
* The LinkQueue.
*/
typedef struct LinkQueue {
LinkNodePtr front;
LinkNodePtr rear;
} *LinkQueuePtr;
/**
* Construct an empty queue.
*/
LinkQueuePtr initQueue() {
auto resultPtr = (LinkQueuePtr) malloc(sizeof(struct LinkQueue));
//The header, the data is not useful.
auto headerPtr = (LinkNodePtr) malloc(sizeof(struct LinkNode));
headerPtr->next = nullptr;
resultPtr->front = headerPtr;
resultPtr->rear = headerPtr;
return resultPtr;
}//Of initQueue
/**
* Output the queue.
*/
void outputLinkQueue(LinkQueuePtr paraQueuePtr) {
LinkNodePtr tempPtr = paraQueuePtr->front->next;
cout << "Now the linkQueue`s elements are:";
while (tempPtr != nullptr) {
cout << tempPtr->data << " ";
tempPtr = tempPtr->next;
}//Of while
cout << endl;
}//Of outputLinkQueue
/**
* Enqueue.
*/
void enqueue(LinkQueuePtr paraQueuePtr, int paraElement) {
//Step 1. Create a new node
auto tempNodePtr = (LinkNodePtr) malloc(sizeof(struct LinkNode));
tempNodePtr->data = paraElement;
tempNodePtr->next = nullptr;
//Step 2. Link to the existing rear
paraQueuePtr->rear->next = tempNodePtr;
//Step 3. It is the new rear
paraQueuePtr->rear = tempNodePtr;
}//Of enqueue
/**
* Dequeue.
* @return The value of the header
*/
int dequeue(LinkQueuePtr paraQueuePtr) {
int resultValue;
LinkNodePtr tempNodePtr;
//Step 1. Is the queue empty?
if (paraQueuePtr->front == paraQueuePtr->rear) {
cout << "The queue is empty, you can`t delete the element." << endl;
return -1;
}//Of if
//Step 2. Change the queue.
tempNodePtr = paraQueuePtr->front->next;
resultValue = tempNodePtr->data;
paraQueuePtr->front->next = paraQueuePtr->front->next->next;
if (paraQueuePtr->rear == tempNodePtr) {
paraQueuePtr->rear = paraQueuePtr->front;
}//Of if
//Step 3. Free space.
free(tempNodePtr);
//Step 4. Return.
return resultValue;
}//Of enqueue
/**
* The entrance.
*/
int main() {
cout << "---- linkQueueTest begins. ---- " << endl << endl;
LinkQueuePtr tempQueuePtr;
tempQueuePtr = initQueue();
enqueue(tempQueuePtr, 1);
enqueue(tempQueuePtr, 3);
enqueue(tempQueuePtr, 5);
enqueue(tempQueuePtr, 7);
enqueue(tempQueuePtr, 9);
outputLinkQueue(tempQueuePtr);
cout << "dequeue gets " << dequeue(tempQueuePtr) << endl;
cout << "dequeue gets " << dequeue(tempQueuePtr) << endl;
cout << "dequeue gets " << dequeue(tempQueuePtr) << endl;
cout << "dequeue gets " << dequeue(tempQueuePtr) << endl;
cout << "dequeue gets " << dequeue(tempQueuePtr) << endl;
cout << "dequeue gets " << dequeue(tempQueuePtr) << endl;
enqueue(tempQueuePtr, 11);
enqueue(tempQueuePtr, 13);
enqueue(tempQueuePtr, 15);
enqueue(tempQueuePtr, 17);
enqueue(tempQueuePtr, 19);
outputLinkQueue(tempQueuePtr);
cout << endl << "---- linkQueueTest ends. ---- ";
return 0;
}//Of main
运行结果如下:
---- linkQueueTest begins. ----
Now the linkQueue`s elements are:1 3 5 7 9
dequeue gets 1
dequeue gets 3
dequeue gets 5
dequeue gets 7
dequeue gets 9
dequeue gets The queue is empty, you can`t delete the element.
-1
Now the linkQueue`s elements are:11 13 15 17 19
---- linkQueueTest ends. ----