2013-08-24 3 views
0

Мой следующий код печатает только первый элемент. В функции print_list() она останавливается после печати первого элемента. Он говорит после первого элемента, head->next - 0. Не следует указывать на второй элемент?Печать связанного списка в C++

Я хочу просто распечатать весь список.

#include<iostream> 
#include<cstdlib> 
using namespace std;  
struct node { 
    int x; 
    node *next; 
};  
node* add_element(node*); 
bool is_empty(node*); 
void print_list(node*); 
node* search(node*); 

int main() 
{ 
    node *head; 
    head=NULL; 
    node* current=head; 
    for(int i=0;i<5;i=i+1) 
    { 
     if (current==NULL) 
     { 
     current=add_element(current); 
     head=current; 
     } 
     else{ 
      current=add_element(current); 
     } 
    } 
    cout<<head->next<<endl; 

    // DOUBT: head->next gives NULL value. It should give me pointer to 2nd node 
    print_list(head); 
}  
node* add_element(node* current) 
{ 
    node* temp; 
    temp=new node; 
    temp->next=NULL; 
    cout<<"enter element"<<endl; 
    cin>>temp->x; 
    current=temp; 
    return current; 
}  
bool is_empty(node* temp) 
{ 
    return temp==NULL;  
}  
void print_list(node* temp) 
{ 
    if (is_empty(temp)==false) 
    { 
     cout<<"here temp(head)"<<temp->next<<endl; 
     while(temp!=NULL) 
     { 
      cout<<temp->x<<endl; 
      temp = temp->next; 
     } 
    } 
} 
+0

Но вы не вызываете: 'print_list()' –

+0

теперь добавлен. Спасибо за указание. Но проблема все еще существует. –

ответ

1

Функция печати напечатать первый элемент, потому что у вас есть только один узел в списке ссылок! На самом деле эта ошибка присутствует в add_element(node*) функции перезапись адреса head узла с новым узлом (так, имеющей утечкой памяти), как я отметил ниже:

node* add_element(node* current) 
    { 
    node* temp;   
    temp = new node;  <---" You allocated memory" 
    temp->next = NULL; <---" Set next NULL" 
    cout<< "enter element" << endl; 
    cin>> temp->x;  <---" Assign a value in new node"  

    // Replace below two line with suggested 
    current = temp;  <---"MISTAKE: Overwrite first node"  
          "temp next is NULL so losing address of other nodes" 

    return current;  <--- "return first node" 
    } 

Следующих нового узел (так первого узел) является NULL, следовательно, печатью функция печатает только значение первого узла.

Предложение:

Вы должны Исправьте следующие действия, чтобы добавить новый узел в качестве первого узла в связанный список:

temp -> next = current; // new nodes next if present first node 
return temp;    // new code becomes first node 

Будьте осторожны current должны быть NULL изначально.

С моим предложением в add_element() функции также изменить для кода петли в main() следующим образом:

for(int i=0; i < 5; i = i + 1){ 
    current = add_element(current); 
} 
head = current; 

И проверить рабочий код на Codepade (вместо пользовательского ввода я добавил значение с помощью y = 100 переменных).

Редактировать Для добавления нового узла:

Вы должны проверить, является ли новый узел первый узел не (читать комментарии).

// returns first node address in linked list = head 
    node* add_element(node* head){ 
    node *temp, *new_nd; 

    // Create new node 
    new_nd = new node; 
    new_nd->next = NULL; 
    cout<<"enter element"<<endl; 
    cin>>new_nd->x; 

    // Is new node is the first node? 
    if(!head) 
     return new_nd; 

    // move to last 
    temp = head; 
    while(temp->next) temp = temp->next; 

    // add new node at last 
    temp->next = new_nd; 

    // return old head 
    return head; 
    } 

Также просто основной(), как показано ниже:

int main(){ 
    node *head = NULL; 
    for(int i = 0; i < 5; i = i + 1){ 
     head = add_element(head); 
    } 
    print_list(head); 
} 

проверки этого working code.

+0

, когда я делаю текущее-> next = temp, программа перестает работать. Я использую MinGW в Windows7 CMD. - –

+0

10 @ user2419974 Вы делаете неверный ответ на чтение Я отправил, изначально 'current' является нулевым, вы не можете сделать' current-> next = temp' –

+0

Я хочу добавить элемент в конце –

1

Ваша проблема здесь:

node* add_element(node* current) 
    { 
    node* temp; //You created a new node 
    temp=new node; //You allocated it here 
    temp->next=NULL; //You set its next property to null 
    cout<<"enter element"<<endl; // 
    cin>>temp->x; 
    current=temp; //This should be current->next = temp. You are overwriting it! 
    return current; //And now you are returning essentially the temp object that 
        //You created and you set its next property to NULL 
    } 

Вы назначаете узел, созданный в temp = new node к текущему узлу, который был принят в То, что вы хотите сделать, это назначить узел, который только что созданный. следующее свойство текущего узла. Он должен быть current->next = temp

+0

Когда я делаю текущее-> next = temp, программа перестает работать. Я использую MinGW в Windows7 CMD. –

+0

Удалить head = NULL в вашем основном() – arp001

0

head-> next NULL, потому что вы установили его так в add_element(). Чтобы иметь связанный список, вы должны установить current-> next = temp.

Поскольку вы используете C++, вы можете использовать std :: list вместо реализации собственного связанного списка.

0
if (current==NULL) 
        { current=add_element(current); 
         head=current; 
        } 
        else 
        { current->next=add_element(current); 
         current=current->next; 
        } 

Правильный код. Вы должны сделать небольшую коррекцию в цикле. Вам нужно добавить новый узел, а затем указать его на следующий из текущего узла. , поэтому упрощенный код является текущим-> next = add_element (текущий) , а затем введите текущую точку в новый ток.

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