2016-02-27 7 views
-4

Это код LinkedList в C++: -Связанный список C++ Node

#include<iostream> 
using namespace std; 
class node{ 
    public: 
    int data; 
    node *next; 
}; 

void insertdata(int element ,node *head){ 

    node *newnode = new node(); 
    newnode -> data = element; 
    newnode -> next = NULL; 

    node *itr; 
    itr=head; 
    if(head == NULL) 
    head = newnode; 
    else{ 

    while(itr->next != NULL){ 
     itr = itr-> next; 
    } 

    itr->next = newnode; 
} 
} 

void print(node *head){ 
    node *print = head; 
    while(print != NULL){ 
     cout<<print->data<<"\n"; 
     print = print -> next; 
    } 
} 

int main(){ 
    node *head = NULL; 
    insertdata(10,head); 
     insertdata(20,head); 
      insertdata(30,head); 
      print(head); 
      return 0; 
} 

Что не работает он работает нормально, если я объявляю голову как глобальный объект. В чем причина того, что я должен объявить его глобально. Я нахожусь на втором курсе B.Tech Student, изучая его в первый раз, так что его взгляд запутан.

+0

Вы должны форматировать Ваш код правильно. – MikeCAT

ответ

0

В C++ аргументы функций: передаются значением, поэтому изменение аргументов в вызываемом вызове не влияет на локальную переменную вызывающего.

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

#include<iostream> 
using namespace std; 
class node{ 
    public: 
    int data; 
    node *next; 
}; 

void insertdata(int element ,node *&head){ 

    node *newnode = new node(); 
    newnode -> data = element; 
    newnode -> next = NULL; 

    node *itr; 
    itr=head; 
    if(head == NULL) 
    head = newnode; 
    else{ 

     while(itr->next != NULL){ 
      itr = itr-> next; 
     } 

     itr->next = newnode; 
    } 
} 

void print(node *head){ 
    node *print = head; 
    while(print != NULL){ 
     cout<<print->data<<"\n"; 
     print = print -> next; 
    } 
} 

int main(){ 
    node *head = NULL; 
    insertdata(10,head); 
    insertdata(20,head); 
    insertdata(30,head); 
    print(head); 
    // do delete what you created via new 
    while(head != NULL){ 
     node *next = head->next; 
     delete head; 
     head = next; 
    } 
    return 0; 
} 
0

Для начала нет необходимости объявлять узел классом класса. Естественно объявлять его классовой структурой. Например

struct node 
{ 
    int data; 
    node *next; 
}; 

Что касается функции insertdata то функция параметры являются ее локальные переменные. Любое изменение локальной переменной не влияет на исходный объект, используемый в качестве аргумента.

Таким образом, вы должны объявить второй параметр либо в виде ссылки на node * как, например,

void insertdata(int element, node * &head); 

или как указатель на node *

void insertdata(int element, node **head); 

В первом случае определение функции может выглядеть

void insertdata(int element, node * &head) 
{ 
    node *newnode = new node { element, nullptr }; 

    if (head == nullptr) 
    { 
     head = newnode; 
    } 
    else 
    { 
     node *itr = head; 
     while (itr->next != nullptr) itr = itr->next; 
     itr->next = newnode; 
    } 
} 

Во втором случае e определение функции может выглядеть так:

void insertdata(int element, node **head) 
{ 
    while (*head) head = &(*head)->next; 

    *head = new node { element, nullptr }; 
} 

Учтите, что обычно новые узлы вставляются в начало односвязных списков.

Также лучше, когда первый параметр относится к заголовку списка.

Вот демонстративная программа, основанная на использовании второго определения функции.

#include <iostream> 

struct node 
{ 
    int data; 
    node *next; 
}; 

void insertdata(node **head, int element) 
{ 
    while (*head) head = &(*head)->next; 

    *head = new node { element, nullptr }; 
} 

std::ostream & print(node *head, std::ostream &os = std::cout) 
{ 
    for (node *current = head; current != nullptr; current = current->next) 
    { 
     os << current->data << ' '; 
    } 

    return os; 
} 


int main() 
{ 
    node *head = nullptr; 

    for (int x : { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }) insertdata(&head, x); 

    print(head) << std::endl; 
}   

Его выход

1 2 3 4 5 6 7 8 9 10 
Смежные вопросы