2013-11-07 2 views
1

Итак, я проследил это, и раздел комментариев дал мне проблему, я нахожусь в конце списка ссылок, и я хочу изменить nullptr на новый узел * q, но я сохраните исходный список ссылок без недавно добавленного узла.append function и nullptr не работает

Node* append(int x, Node* p) { 

Node *q=new Node; 
Node *head=p; 

if(p==nullptr) { 
    p=q; 
    q->value=x; 
} 

while (p!=nullptr) { 
    p=p->next; 
} 
//arrived at NULL ptr 
q=p->next; //<---this is causing my program to crash. 
q->value=x; 
q->next=nullptr; 

return head; 

}

+2

Я предпочитаю 'если (! Р)' в 'если (р == nullptr)' и 'while (p)' to 'while (p! = nullptr)'. Во всяком случае, вы зацикливаете до тех пор, пока 'p' не будет иметь нулевой указатель, а затем разыщите его. – chris

ответ

3

Крис уже сказал вам, что эта проблема. Прогуливая указатель на нуль, а затем разыгрывая его, вы получите то, что вы просили: неопределенное поведение

Это сделает то, что вы хотите, с значительно меньшим количеством кода.

Node* append(int x, Node* p) 
{ 
    Node **pp = &p; 
    while (*pp) 
     pp = &(*pp)->next; 

    *pp = new Node; 
    (*pp)->value = x;  // this really should be a Node::Node() parameter 
    (*pp)->next = nullptr; // ... and this should be set in Node::Node as well 

    return p; 
} 

, и было бы еще проще, если вы сделаете Node::Node(int x) разумного. Например, с Node как:

struct Node 
{ 
    int val; 
    Node *next; 

    Node(int val) : val(val), next() {} 
}; 

Вы можете просто сделать это:

Node* append(int x, Node* p) 
{ 
    Node **pp = &p; 
    while (*pp) 
     pp = &(*pp)->next; 
    *pp = new Node(x); 
    return p; 
}