2010-11-01 2 views
0

Я пытаюсь выяснить, есть ли у меня общая идея по поводу оператора присваивания для двунаправленных списков с использованием текущего узла (без переднего или заднего). Это мой псевдокод. Мне нужно снять эту концепцию. Если кто-то может помочь, это будет мило.Оператор присваивания списка ссылок

Loop to start 
    temp = temp->back 
loop to count 
    if 0 
     receiver->back = null 
     receiver->entry = temp->entry 
     receiver->next = temp->next 
    if > 0 
     receiver->back = temp->back 
     receiver->entry = temp->entry 
     receiver->next = temp->next 
    if == count-1 
     receiver->back = temp->back 
     receiver->entry = temp->entry 
     receiver->next = null 

Это моя структура Node:

struct Node { 
    // data members 
    Node_entry entry; 
    Node<Node_entry> *next; 
    Node<Node_entry> *back; 
    // constructors 
    Node(); 
    Node(Node_entry, Node<Node_entry> *link_back = nullptr, 
     Node<Node_entry> *link_next = nullptr); 

} 

Я не ищу для кода ответа, но алгоритм (на самом деле код, который хорошо документирован и написано хорошо, как пример). Мне просто нужно понять, как работает копирование.

+0

Вы спрашиваете, как скопировать дважды связанный список? –

+0

Нам нужна дополнительная информация о вашей конкретной реализации списка. В C++ (с которым вы помечали первоначально), обычно имеет класс «контейнер», который представляет весь список, что значительно упрощает его. (Кажется, вы имеете дело с равными узлами и, возможно, указателями на один узел, чтобы представлять полный список.) – 2010-11-01 15:25:32

+0

Я хочу знать, как его скопировать, но я не ищу конкретный код в качестве ответа, алгоритм. Я просто хочу получить концепцию, поэтому я могу понять, как она работает. – knownasilya

ответ

0
struct Node { 
    Node *prev, *next; 
    int entry; 

    explicit Node(int entry) : prev (0), next (0), entry (entry) {} 
}; 

Node* copy_list(Node *node) { 
    assert(node); // require a non-null pointer 

    // copy "current" node 
    Node *new_list = new Node(node->entry); 

    // copy backward from node to beginning 
    Node *dest = new_list; 
    for (Node *x = node->prev; x; x = x->prev) { 
    dest->prev = new Node(x->entry); 
    dest->prev->next = dest; 
    dest = dest->prev; 
    } 

    // copy forward from node to end 
    dest = new_list; 
    for (Node *x = node->next; x; x = x->next) { 
    dest->next = new Node(x->entry); 
    dest->next->prev = dest; 
    dest = dest->next; 
    } 

    return new_list; 
} 
+0

Будет ли этот код копировать текущий узел дважды? Если он копирует из узла назад, а затем из узла вперед, он не копирует список с двумя из первого узла по умолчанию? Кроме того, не копируют ли записи в другом порядке, чем полученные от пользователя? Было бы лучше начать и скопировать с самого начала? – knownasilya

+0

@Knownasilya: при копировании назад/вперед он начинается с предыдущего и следующего, а не с текущего узла, поэтому текущий узел сначала копируется явно. Он копируется в другом порядке, но хранится в том же порядке; обратите внимание, как dest создает в том же направлении, что и узел. – 2010-11-03 14:25:15

+0

@Knownasilya: При использовании указателя исходного кода, поскольку ваш список будет работать, я настоятельно рекомендую вам следовать чему-то ближе к std :: list и создавать «общий» класс списка. – 2010-11-03 14:26:31

Смежные вопросы