链式队列设计

所谓队列的链式存储结构是用一个线性链表来表示一个队列,队列中每一个元素对应链表中一个链结点,这样的队列简称链接队列。具体地说,把线性链表第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. ----

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值