在c ++中实现push函数

时间:2014-02-27 17:00:54

标签: c++ linked-list push

我在创建推送功能时遇到了一些麻烦(在列表的前面添加一个节点)。 我知道只有一个节点,你可以使用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;

感谢您的任何帮助。

4 个答案:

答案 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类型对象的数据成员lastStew必须初始化为nullptrNULL

例如

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;
    }
}