[英]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
和指针参数重载函数时,混合使用NULL
和nullptr
可能会导致问题。
现在到手头的问题。 每个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.