2013-08-01 2 views
0

У меня есть код, который, кажется, работает, но я не могу получить значения, хранящиеся в связанном списке между первым и последним узлами, указатели между ними пропущены? И разыменования эти пропускаются указатель дает мне Segfault, вот кодСвязанный список с помощью класса

#include<iostream> 
#include <new> 
using namespace std; 

class list{ 
    int value; 
    list* next; 

public:  
    list(int a=0, list* b=0) {value=a;next=b;}  
    //~list() {delete next;} 
    void newnode(int a, list* tmp) { 
     tmp->next=new list; 
     tmp=tmp->next; 
     cout<<"Address of next: "<<tmp<<'\n'; 
     tmp->value=a; 
    } 

    void printlist (list* regist){ 
     list* tmp; 
     tmp=regist; 
     cout<<tmp->value<<'\n'; 

     while(tmp->next != 0){ 
      tmp=tmp->next; 
      cout<<tmp->value<<'\n'; 
      cout<<"Address of next: "<<tmp<<'\n'; 
     } 
    } 
}; 

int main() { 
    int first;  
    cout<<"Enter value for origin: \n"; 
    cin>>first; 
    list* root=new list(first); 
    list* tpo=root; 
    cout<<"How many numbers to add? \n"; 

    int choice; 
    cin>>choice; 

    int num; 
    while(choice) { 
     cout<<"Enter value: \n"; 
     cin>>num;  
     root->newnode(num, tpo); 
     choice--; 
    } 

    cout<<"Do you want me to show you these values, type 1 for yes and 0 for no: \n"; 
    cin>>choice; 

    if(choice) { 
     root->printlist(root); 
    } 
} 
  1. На печать значения почему это пропустить эти указатели (узлы) между ними?
  2. Являются ли промежуточные узлы указаными на уничтоженные? Если это так, комментируя деструктор, нужно сделать трюк, верно?

Что я делаю неправильно?

+2

С одной стороны, вы не используете согласованный отступ. Поэтому никто не имеет большого шанса прочитать ваш код. –

+0

'root-> newnode (num, tpo);' никогда не обновляет 'root' или' tpo', поэтому каждое новое значение заменяет предыдущее –

+0

Спасибо @FredLarson, я буду учитывать это, извините. –

ответ

2

1) Вы всегда перезаписать 2-й элемент в списке, когда вы вызовите больше значений. Вы должны изменить подпись newnode() на newnode(int a, list*& tmp).

Позже изменения: другой путь будет иметь следующую подпись list* newnode(int a, list* tmp) и в конце функции, которую вы хотите return tmp;. Затем в главном цикле у вас будет tpo = root->newnode(num, tpo);. Таким образом, tpo всегда будет указывать на следующий элемент.

2) Кроме того, для освобождения памяти деструктор памяти list не должен ничего делать, в частности. Я бы сказал, что вы делаете статический метод в своем классе, который удаляет список. Что-то вроде этого:

public: static void deleteList(list*& root) { list* tmp = root; while (tmp) { tmp = root->next; delete root; root = NULL; root = tmp; } };

и назвать его как list::deleteList(root);

+0

Извините, не удается изменить код в точке 2. Grr –

+0

О пункте 1, зачем передавать указатель в качестве ссылки, потому что я думал, что значение может быть изменено либо, если переменная передается как ссылка или как указатель –

+0

Вам нужно передать указатель по ссылке, потому что вам нужно изменить ** указатель **, а не объект, на который указывает указатель, когда вы делаете 'tmp = tmp-> next;'. Если вы этого не сделаете, 'tmp' будет по-прежнему указывать на тот же указатель, что' tmp' указывал перед входом в функцию, и я считаю, что вы хотите, чтобы 'tmp' указывал на' tmp-> next'. Sheesh, мне действительно нужно улучшить свой словарный запас: D (я использовал «очко» 4 раза в последней фразе) –

2

вы всегда подачи root к newnode (как был назначен tpo), в результате список с двумя элементами и произвольным числом просочилась памяти

+0

Прошу прощения, но я относительно новичок в C++, но могу ли я спросить, как передача адреса приведет к утечке памяти? –

+0

Вы всегда переписывали адрес 'tmp-> next', когда вы делали' tmp-> next = new list; '. Это произошло потому, что 'tmp-> next' всегда указывал на 2-й элемент в списке, а не на 2-й, 3-й и т. Д. –

+0

Еще раз спасибо, ваш предыдущий комментарий был чрезвычайно полезен для выяснения того, как работают указатели :), и это сделало больше смысл сейчас. –

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