Одиночные связанные списки C ++ - PullRequest
0 голосов
/ 17 мая 2011

Эй, ребята, я сейчас учусь на среднесрочную перспективу и работаю над попыткой создать простую программу, используя один связанный список.Все, что я хочу, это вставить «1», «2», «3», «4» в список и распечатать его.Пожалуйста, взгляните на следующий код:

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

class node{
public:
    node(int data);
    friend class slist;
private:
    int data;
    node *next;
};

node::node(int data){
    data = data;
    next = NULL;
}

class slist{
public:
    slist(){
        head = NULL;
    }
    void insert(int item);
    void output();

private:
    node* head;
};   

void slist::insert(int item){
    node* newnode = new node(item);
    if(head == NULL)
    {
        head = newnode;
    }
    else
    {
        newnode->next = head;
        head = newnode;
    }
}

void slist::output(){
    node* p = head;
    while (p->next != NULL){
        cout << p->data << " ";
        p = p->next;
    }
    cout << p->data << " ";
}

int main(){
    slist FINAL;

    FINAL.insert(1);
    FINAL.insert(2);
    FINAL.insert(3);
    FINAL.insert(4);

    FINAL.output();

    return 0;
}

Он отлично компилируется, но выводит (я предполагаю) указатели вместо фактических чисел.Может кто-нибудь сказать мне, почему?

Большое спасибо!

Ответы [ 3 ]

6 голосов
/ 17 мая 2011

В конструкторе node есть ошибка.Аргумент data конфликтует с переменной memeber с именем data.Это должно исправить это:

node::node(int data){
    this->data = data;
    next = NULL;
}

Лучший вариант - переименовать аргумент в другоеТакже рассмотрите возможность использования списка инициализации :

node::node(int d) : data(d), next(NULL) { }
3 голосов
/ 17 мая 2011
node::node(int data) {
    data = data;
    next = NULL;
}

Линия data = data - это проблема для вас. Переименуйте параметр, чтобы он отличался от члена. Это должно дать вам ряд значений мусора (не указателей) для переменной-члена data.

Примечание: это одна из причин, по которой соглашение о присвоении имен различает переменные-члены, будь то трейлинг или лидирующие _, m_ или где баланс - это ч / б информация и эстетика.

1 голос
/ 17 мая 2011

Ну, я думаю, что оба экземпляра data в

data = data;

являются локальными;поэтому элемент данных node никогда не получает ничего назначенного ему.То, что печатается, это неопределенные значения, а не адреса.Это в любом случае стилистически ужасно;здесь есть много соглашений, но хорошим является _data для члена класса и data для аргумента функции.Сделайте это простое изменение и посмотрите, не решит ли это вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...