Функция отображения в связанном списке не работает должным образом - PullRequest
0 голосов
/ 21 октября 2018

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

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

class linklist{
    private:
        node *start, *temp, *cur;
    public:
        linklist(){
            start = NULL;
        }
        void insert(char x){
            if (start == NULL){
                start = new node;
                start->data = x;
                start->link = NULL;
                cur = start;
            }
            else
            while (cur->link != NULL){
                cur = cur->link;
            }

                temp = new node;
                temp->data = x;
                temp->link = NULL;
                cur->link = temp;

        }
        void display(){
            cur = start;

            while (cur->link != NULL){  
                cout << "Value is: " << cur->data << endl;
                cur = cur->link;
            }
            cout << "Value is: " << cur->data << endl;
        }
};
int main(){
    linklist obj;
    obj.insert('e');
    obj.insert('t');
    obj.insert('r');
    obj.insert('w');
    obj.insert('l');
    obj.display();

    system("Pause");
}

ожидаемый вывод: etrwl.
Фактический вывод: eetrwl

1 Ответ

0 голосов
/ 21 октября 2018

У вас две проблемы с вашим кодом.Во-первых, отсутствует {...}, окружающий ваш оператор else в insert().Чтобы необходимый код применялся только к случаю else, вам необходимо заключить в скобки весь else скобки, например:

        else {
            while (cur->link != NULL) {
                cur = cur->link;
            }
            temp = new node;
            temp->data = x;
            temp->link = NULL;
            cur->link = temp;
        }
    }

Во-вторых, ваше условное условиеиспользуется для display() неверно.Вы хотите выводить содержимое только тогда, когда cur != NULL , а не , когда cur->next != NULL (поэтому вы попытались добавить дополнительный оператор вывода после окончания цикла, чтобы перехватить ваше последнее значение).Не делайте этого, если вы обнаружите, что пытаетесь сделать что-то подобное - вы, вероятно, делаете это неправильно.

С этим изменением у вас просто есть:

    void display() {
        cur = start;
        while (cur != NULL) {  
            cout << "Value is: " << cur->data << endl;
            cur = cur->link;
        }
    }

В целом, вы получите:

#include <iostream>

using namespace std;

class node{
public:
    char data;
    node *link;
};

class linklist{
private:
    node *start, *temp, *cur;
public:
    linklist() {
        start = NULL;
    }

    void insert (char x) {
        if (start == NULL) {
            start = new node;
            start->data = x;
            start->link = NULL;
            cur = start;
        }
        else {
            while (cur->link != NULL) {
                cur = cur->link;
            }
            temp = new node;
            temp->data = x;
            temp->link = NULL;
            cur->link = temp;
        }
    }

    void display() {
        cur = start;
        while (cur != NULL) {  
            cout << "Value is: " << cur->data << endl;
            cur = cur->link;
        }
    }
};

int main (void) {

    linklist obj;

    obj.insert('e');
    obj.insert('t');
    obj.insert('r');
    obj.insert('w');
    obj.insert('l');
    obj.display();

    system("Pause");
}

Пример использования / Вывод

$ ./bin/llinsert
Value is: e
Value is: t
Value is: r
Value is: w
Value is: l

Посмотрите вещи и дайте мне знать, если у вас есть дополнительные вопросы.

...