Как изменить пользовательский ввод в связанном списке? - PullRequest
0 голосов
/ 10 мая 2018

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

Можно ли редактировать данные, введенные пользователем?

Пожалуйста, посмотрите на код, это возможный способ изменить его?

Чтобы изменить значения списка, я реализовал простой механизм запроса, но есть небольшая проблема:

После того, как пользователь вводит возраст, программа немедленно перестает работать.

void node::update()
{
    int updateAge;
    cout << "Please enter age: ";
    cin>>updateAge;
    int ch;
    int a;
    node *current;
    node *temp;
    node *start_ptr;

    if (start_ptr == NULL)
        cout << "No record to update!" << endl;
    else
    {
        current = start_ptr;

        while((current!=NULL) && (current->temp->age!=updateAge))
        {
            current=current->next;
        }
        if (current==NULL)
            {cout<<"The Requested age is Not Found" << endl;}


        else if(current->temp->age==updateAge)
        {
            cout<<"What Information You Want To Update?" << endl;
            cout<<"1. Name" << endl;
            cout<<"2. Height" << endl;
            cin>>ch;
            system("cls");

            switch(ch)
            {
                case 1 :
                {
                    cout << "Enter New Name: ";
                    cin.ignore();
                    getline(cin, current->temp->name);
                    break;
                }

                case 2 :
                {
                    cout<<"Enter New Height: ";
                    cin >> current->temp->height;
                    break;
                }

                default:
                {
                    cout<<"Wrong Input! Please choose again: ";
                    cin>>ch;
                }
            }
            cout<<"RECORD UPDATED !";
        }
    }
}

struct list
{
    list *head, *tail;
    list *next;
};

class node
{
    private:
        std::string name; // Name
        int age; // Age in integer
        float height; // In meters

    public:
        node *next; // Pointer to next node
        node *head, *tail;
        node *start_ptr = NULL; // Start Pointer (root)
        node *temp;
        node *temp2;
        node *pNextValue;
        node* prev; // empty header
        node* current;
        void update();
        void printList();
        void delete_end_node();
        void search();
        void sort_age();
        void deletebyAge();
    node()
        {
            head = NULL;
            tail = NULL;
        }


        void getInput()
        {
            temp = new node;
            cout << "Name: ";
            cin >> temp->name;
            cout << "Age: ";
            cin >> temp->age;
            cout << "Height: ";
            cin >> temp->height;

            cout<<"\n";
            temp->next = NULL; // Sets the node to be the last node
            if (start_ptr == NULL)
                start_ptr = temp;
            else
            {
                temp2 = start_ptr; // We know temp2 is not NULL - list not empty!
                while (temp2->next != NULL) // The loop will terminate when temp2
                    temp2 = temp2->next;        // points to the last node in the list
                                                    // Move to next link in chain
                temp2->next = temp; // Sets the pointer from that last node to point
                                    // to the node that has just declared
            }
        } // End of getInput() function
}; //End of class

1 Ответ

0 голосов
/ 10 мая 2018

В вашей функции-члене update вы изменяете указатель на новый узел с именем start_ptr, который не указывает ни на что в вашем списке. Вы должны просто использовать Node *current = start_ptr; Также нет смысла делать переменные current или temp в вашем классе узлов.

Это все, что вам нужно для узла и списка:

class Node {
public:
    Node() : data(0), prev(nullptr), next(nullptr) {}
    Node(int newData, Node *newPrev, Node *newNext)
    : data(newData), prev(newPrev), next(newNext) {}

    int getData() const { return data; }
    Node *getPrev() const { return prev; }
    Node *getNext() const { return next; }
    void setData(const int& newData) { data = newData; }
    void setPrev(Node *newPrev) { prev = newPrev; }
    void setNext(Node *newNext) { next = newNext; }
    ~Node() {}
private:
    int data;
    Node *prev;
    Node *next;
};

class DoublyList {
public:
    DoublyList(); 

    ~DoublyList();

    void destroyList();

private:
    Node *first;    // pointer to the first node on the list
    Node *last;     // pointer to the last node on the list
    int count;      // number of nodes in the list
};

Также эти строки:

    current = start_ptr;

    while((current!=NULL) && (current->temp->age!=updateAge))
    {
        current=current->next;
    }
    if (current==NULL)
        {cout<<"The Requested age is Not Found" << endl;}

Вы устанавливаете current в next в цикле while, так что в конечном итоге текущий станет nullptr, поэтому оператор if будет оценен как true, что приведет к выводу «Запрошенный возраст не найден» .

Еще одна вещь: не используйте NULL, вместо этого используйте nullptr.

...