2016-01-09 2 views
-3

Я новичок в кодировании cpp, и я не понимаю, как мы можем получить следующие результаты об объекте узлов? может ли кто-нибудь помочь?Вывод функций, основанных на узлах

Заранее спасибо :)

Выход следующей программы

Вот код:

void display(Node *head){ 

    if(head == NULL) 
    cout<<"head is NULL"<<endl; 

    for(Node *tmp=head; tmp!=NULL; tmp = tmp->next) 
    cout<<" "<<tmp->data; 
    cout<<endl; 
} 

Node *func1(int value1, int value2, int value3){ 
    Node *head = new Node; 
    head->next = new Node; 
    head->next->next = new Node; 
    head->next->next->next = NULL; 
    head->data = value1; 
    head->next->data = value2; 
    head->next->next->data = value3; 
    return head; 
} 

void func2(Node *head1, Node *head2, Node *head3){ 
    head1->next = head3; 
    head1->next->data =3; 
    head1= head2; 
    head1->data = 5; 
    head1->next->data = 7; 
    head2 = head3; 
    head3 = head1; 
} 

void func3(Node *head){ 
    for(; head!= NULL; head = head->next) 
     head->data *=2; 
} 

int main(){ 

Node *head1 = func1(10,20,30); 
Node *head2 = func1(2,4,6); 
Node *head3 = func1(11,22,33); 

func2(head1, head2, head3); 
display(head1); 
display(head2); 
display(head3); 

head1 = func1(1,2,3); 
func3(head1); 
display(head1); 
return 0; 
} 

EDIT:

может кто-нибудь объяснить, как мы можем видеть изменения в элементах данных, хотя мы не можем видеть изменения локальных указателей? Я предполагаю, что мы не должны видеть никаких изменений данных, так как главные указатели являются копиями реальных?

Например, мы можем видеть head1-> data = 5, но часть head2 = head1 не имеет никакого эффекта. Зачем?

Я очень очень смущен об этой теме, пожалуйста, помогите :(

+1

Вам нужно будет уточнить, что вы не понимаете. Вы ожидаете, что он выведет что-то еще? –

+0

в func2 мы делаем head2 = head3 и head2 = head1, но когда я применяю эти равенства, я не могу получить тот же результат, что и выше – cppnewer

+0

Я думаю, что порядок выходов должен быть совершенно другим из-за этих уравнений – cppnewer

ответ

0

func2 не делать то, что вы думаете:

void func2(Node *head1, Node *head2, Node *head3){ 
    head1->next = head3; 
    head1->next->data =3; 
    head1= head2; 
    head1->data = 5; 
    head1->next->data = 7; 
    head2 = head3; // this has no effect 
    head3 = head1; // this has no effect 
} 

Когда вы говорите head2 = head3, вы меняете локальный указатель head2 , вы не меняете соответствующий указатель вызывающего абонента. Это также относится к head3 = head.

Возможно, вы планировали передать указатели по ссылке:

void func2(Node *&head1, Node *&head2, Node *&head3){... 

Теперь соответствующие указатели в вызывающем абоненте будут затронуты заданиями. Если параметры не являются ссылками, то они являются просто копиями аргументов, которые были первоначально переданы.

+0

@cppnewer: Я расширил мой ответ. Посмотрите, насколько это яснее. –

+0

thank youu я понимаю эту часть :), но я не получил переменную часть данных, как мы можем изменить значения и наблюдать за этими изменениями вне функции, хотя мы не можем видеть изменения локального указателя – cppnewer