我在创建推送功能时遇到了一些麻烦(在列表的前面添加一个节点)。 我知道只有一个节点,你可以使用c ++给出的push函数作为push_front(),但我也可以在这里使用它吗? :
struct Node {
string val;
Node* next;
Node* prev;
};
struct Stew {
Node* first;
Node* last;
};
Stew结构被定义为有两个特殊指针,一个指向第一个元素,一个指向最后一个。 Node结构在两个方向都有链接。
我很擅长在C ++中使用这些类型的结构,因此非常感谢任何类型的帮助/提示。我试过它:
void push (Stew& q, string val) {
Node *inserted = new Node(); // create a new node to be inserted in the front
q.first -> prev = inserted;
inserted -> next = q.first;
inserted -> val = q.first->val;
}
问题:我是否需要为此初始化头?这样:
Node *head = new Node();
head -> next = NULL;
head -> val = val;
感谢您的任何帮助。
答案 0 :(得分:2)
您的代码存在以下问题:
void push (Stew& q, string val) {
Node *inserted = new Node();
// q.first can be NULL, so check before dereferencing it
q.first -> prev = inserted; // Looses any node that prev was
// pointing to before
inserted -> next = q.first;
inserted -> val = q.first->val; // you probably meant:
// inserted -> val = val;
}
答案 1 :(得分:1)
我不知道你说的是哪个头。
当然,first
类型对象的数据成员last
和Stew
必须初始化为nullptr
或NULL
。
例如
Stew q = {};
该功能可以采用以下方式
void push( Stew &q, const string &val )
{
Node *tmp = new Node { val, q.first, nullptr };
if ( q.first != nullptr ) q.first->prev = tmp;
q.first = tmp;
if ( q.last == nullptr ) q.last = q.first;
}
你可以清楚地了解这个功能在这里的作用是一个简单的例子
编辑:我在示例中添加了函数reverse_display
。
#include <iostream>
#include <string>
struct Node {
std::string val;
Node* next;
Node* prev;
};
struct Stew {
Node* first;
Node* last;
};
void push( Stew &q, const std::string &val )
{
Node *tmp = new Node { val, q.first, nullptr };
if ( q.first != nullptr ) q.first->prev = tmp;
q.first = tmp;
if ( q.last == nullptr ) q.last = q.first;
}
void display( const Stew &q )
{
for ( Node *tmp = q.first; tmp; tmp = tmp->next )
{
std::cout << tmp->val << ' ';
}
}
void reverse_display( const Stew &q )
{
for ( Node *tmp = q.last; tmp; tmp = tmp->prev )
{
std::cout << tmp->val << ' ';
}
}
int main()
{
Stew q = {};
for ( char c = 'A'; c <= 'Z'; c++ )
{
push( q, std::string( 1, c ) );
}
display( q );
std::cout << std::endl;
reverse_display( q );
std::cout << std::endl;
return 0;
}
输出
Z Y X W V U T S R Q P O N M L K J I H G F E D C B A
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
不要忘记编写将删除节点所有已分配内存的函数。
答案 2 :(得分:0)
您需要将q.first
设置为第一个节点:
void push (Stew& q, string val) {
Node *inserted = new Node(); // create a new node to be inserted in the front
q.first -> prev = inserted;
inserted -> next = q.first;
inserted -> val = q.first->val; //although you maybe meant inserted -> val = val;
q.first=inserted;
}
答案 3 :(得分:0)
创建Stew实例时,应将head和tail设置为NULL。
Stew s;
s.first = NULL;
s.last = NULL;
如果使用类而不是结构,则可以在构造函数中完成。 推送功能可以是
void push (Stew& q, string val) {
Node *inserted = new Node(); // create a new node to be inserted in the front
inserted->val = val;
if (q.first == NULL) { // This list is currently empty
// Make the inserted element the only element
inserted->prev = NULL;
inserted->next = NULL;
q.first = inserted;
q.last = inserted;
}
else { // The list has elements
q.first->prev = inserted;
inserted->next = q.first;
inserted->prev = NULL;
q.first = inserted;
}
}
此代码可以简化(删除冗余代码)到
void push (Stew& q, string val) {
Node *inserted = new Node(); // create a new node to be inserted in the front
inserted->val = val;
inserted->prev = NULL;
inserted->next = q.first;
q.first = inserted;
if (q.first == NULL) { // This list is currently empty
// Make the inserted element the only element
q.last = inserted;
}
}