繁体   English   中英

使用指针在 C++ 中入队/出队?

[英]Enqueue/Dequeue in C++ Using Pointers?

我现在开始为我的班级跳入 C++,我们在 Scheme 中介绍了入队和出队。 但是,我们现在用 C++ 来做,我们需要使用指针,我很难理解。 我了解什么是指针,何时使用它们等等。但是,我正在努力弄清楚如何将它们实施到这个实验室中。 我目前有这个代码:

#include <stdlib.h>
#include <iostream>
#include <assert.h>
using namespace std;

struct node {
    int item;
    node* next;
};

typedef node* nodePtr;   

typedef nodePtr* queue;  

queue makeQueue() {
    queue q = new nodePtr[2];
    q[0] = NULL;         
    q[1] = NULL;
    return q;
}

nodePtr start(queue q) {
    return q[0];
}

nodePtr tail(queue q) {
    return q[1];
}

void setStart(queue q, nodePtr newNode) {
    q[0] = newNode;
}

void setTail(queue q, nodePtr newNode) {
    q[1] = newNode;
}

bool emptyQueue(queue q) {
    return q[0] == NULL;
}

int head(queue q) {
    if (emptyQueue(q)) {
        cout << "Attempt to take head of an empty queue.\n";
        exit(1);
    }
    return start(q)->item;
}

void enqueue(queue q, int newItem) {
    // Answer goes here.
}

void dequeue(queue q) {
    // Answer goes here.
}

对于这段代码,我明白我需要做什么:Enqueue 将 newItem 推送到队列的 cdr(或尾部),Dequeue 将删除队列开头的节点,并相应地更新适当的位置。 但真正让我困惑的只是指针,我不知道该怎么办。

我将如何用指针深入编写入队和出队? 我会茫然地假设入队和出队不应该是一行又一行的代码。

非常感谢!

在处理基于指针的动态结构(如堆栈、链表和队列)时,一切都与重新排列指针有关。 正如评论中所建议的那样,将指针表示为纸上指向节点的箭头将有助于形象化在入队/出队时如何重新分配指针。

我还想指出,您不应该像以前那样混合使用 C 和 C++ 头文件。 C++ 库包括与 C 语言库相同的定义,以相同的头文件结构组织。 每个头文件与 C 语言版本具有相同的名称,但带有“c”前缀且没有扩展名。 例如,C 语言头文件<stdlib.h>的 C++ 等效项是<cstdlib> ,类似地, <assert.h><cassert> 此外,在 C++ 中,NULL 指针是nullptr 使用int和指针参数重载函数时,混合使用NULLnullptr可能会导致问题。

现在到手头的问题。 每个node都有一个成员next ,它是指向队列中下一个node的箭头。 看起来, q[0]q[1]分别是指向第一个和最后一个元素的箭头。

如果您只想从有效负载数据(而不是完整node )中加入一个新元素,那么您必须首先动态创建node对象。 然后它的next指针必须指向q[0]->next所指向的内容,而q[0]->next必须重新分配以指向您刚刚创建的新节点:

前:

q[0]->next ---> somenode

后:

q[0]->next -.    -XXX->    somenode
            |                  ^
            |                  |
            '-> newnode->next -'

或者在 C++ 中(没有验证):

void enqueue(queue q, int newItem) {
    nodePtr newnode = new node;
    newnode->item = newItem;
    newnode->next = q[0]->next;
    q[0]->next = newnode;
}

出列相应地进行,看看您需要如何重新排列指针。 不要忘记delete已删除的节点,并提供删除makeQueue创建的queue的功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM