Как передать структуру по ссылке в C ++? - PullRequest
2 голосов
/ 18 октября 2019

Я только начал изучать C ++.

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

#include <iostream>
#include <string>
#include <cstdlib>

using namespace std;

struct Student {
    string name;
    Student* next;
};

void add_student(Student *, Student *);
void print_list(Student *);

int main()
{   
    Student *head, *tail;
    head=NULL;
    tail=NULL;

    while (true) {
        cout << "\nOptions:\n";
        cout << "To add Student [A]\n";
        cout << "To print Student list [P]\n";
        cout << "Quit Q  [Q]\n";

        string choice = "";
        cin >> choice;

        if (choice.compare("A") == 0) {
            add_student(head, tail);
            cout << "Book successfully added.\n";
        }
        else if (choice.compare("P") == 0) {
            print_list(head);
        }
        else if (choice.compare("Q") == 0) {
            cout << "Bye!";
            break;
        }
        else {
            cout << "Invalid choice.\n";
        }
    }
}

void add_student(Student *head, Student *tail)
{
    string name;
    cout << "Enter name of student \n";
    cin >> name;

    Student *temp = new Student;
    temp->name = name;
    temp->next = NULL;

    if(head==NULL)
    {
        head=temp;
        tail=temp;
        temp=NULL;
    }
    else
    {   
        tail->next=temp;
        tail=temp;
    }

    // Check student has been added successfully.
    print_list(head);
}

void print_list(Student *head)
{
    cout << "Student list is as following:\n";
    Student *temp=new Student;
    temp=head;
    while(temp!=NULL)
    {
      cout<< temp->name <<"\n";
      temp = temp->next;
    }
}

Однако проблема в том, что каждый раз, когда добавляется новый студент, он добавляется в качестве первого элемента в списке, а не добавляется в последний. Я думаю, что я делаю некоторые ошибки с Pass по ссылке.

Прошу вас проверить и подсказать, где я совершаю ошибку. Это было бы очень полезно, потому что я новичок в C ++, и я действительно хочу учиться на своих ошибках.

1 Ответ

2 голосов
/ 18 октября 2019

Если вы хотите изменить head и tail внутри main(), вам нужно будет передать указатели по ссылке:

void add_student(Student *&, Student *&);
void print_list(Student *&);

Конечно, вам придется изменить свойреализация тоже.

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