C ++ Итерация по связанному списку - PullRequest
0 голосов
/ 04 мая 2018

Итак, в моей текущей программе мне поручено хранить вектор ветвей. Эти ветви содержат строковое имя и указатель на узел.

В этих узлах хранится книга с именем автора, названием и количеством копий.

В целом, это должно создать структуру данных связанного списка.

В настоящее время я пытаюсь написать программу для печати всех книг в ветке.

После добавления этих книг в ветку Алекс.

Стэн Мун

Билл Сан

Крис Граунд

Я пытаюсь распечатать их все, используя функцию printall (). Тем не менее, я просто получаю пустой вывод. Что-то мне не хватает?

Заранее спасибо!

#include "Library.h"


#include <vector>
#include <string>
#include <iostream>

using namespace std;
int total;
int index;

Library::Library()
{

}


struct Node //Has everything in it
{
    string author;
    string title;
    int copies;


    Node* next;
};

struct Branch // Stores just the branch, and a point to the node with information in it.
{
    string b_name;
    Node* next;
};



vector<Branch> lib;

void Library::start()
{
    int choice;

    cout << "Please select a choice." << endl;
    cout << " " << endl;
    cout << "1. Create a branch and insert its books" << endl;
    cout << "2. Given an author name, a title and a branch name, CHECKOUT that book from the branch." << endl;
    cout << "3. Given an author name, title and a branch name, RETURN that book to the branch." << endl;
    cout << "4. Given an author name, title and branch name, FIND the number of copies of that book are available in that branch." << endl;
    cout << "5. PRINT all books contained in a branch." << endl;
    cout << "6. Exit the program." << endl;

    cin >> choice;

    if (choice == 1)
    {

        insert();

    }

    if (choice == 5)
    {
        printAll();
    }

}

void Library::insert()
{
    string br;
    string auth;
    string titl;

    cout << "What is the name of the branch?" << endl;
    cin >> br;

    Branch *branch = new Branch();

    branch->b_name = br;
    lib.push_back(*branch);

    if (total == 0)
    {
        cout << "What is the author and title of the book?" << endl;
        cin >> auth >> titl;

        Node *book = new Node();
        book->author = auth;
        book->title = titl;
        book->copies++;
        book->next = NULL;
        branch->next = book;
        total++;
    }

    do
    {
        cout << "What is the author and title of the book?" << endl;
        cin >> auth >> titl;
        Node *book = new Node();
        book->author = auth;
        book->title = titl;
        book->copies++;
        book->next = branch->next;
        branch->next = book;
        total++;
    } while (auth != "NONE" && titl != "NONE");



    start();



}
void Library::checkout()
{
    string auth;
    string titl;
    string bran;

}

void Library::Return()
{
//TODO
}

void Library::find()
{
//TODO
}

void Library::printAll()
{
    for (unsigned int i = 0; i < lib.size(); i++)
    {
        while (lib.at(i).next != NULL)
        {
            cout << "There are " << lib.at(i).next->copies << "of " << lib.at(i).next->title << "by " << lib.at(i).next->author << "in branch " << lib.at(i).b_name << endl;
            lib.at(i).next = lib.at(i).next->next;
        }
    }
    start();
}

1 Ответ

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

Я обнаружил некоторые проблемы с вашим исходным кодом:

  • Вы должны держать указатель в векторе lib, иначе он будет клонирован при push_back
  • Функция insert была неправильно реализована
  • Вы должны использовать цикл вместо рекурсивного вызова, это может вызвать переполнение стека

Проверьте измененную версию:

#include "Library.h"
#include <vector>
#include <string>
#include <iostream>

using namespace std;
int total;
int index;

Library::Library()
{

}

struct Node //Has everything in it
{
    string author;
    string title;
    int copies;
    Node* next;
};

struct Branch // Stores just the branch, and a point to the node with information in it.
{
    string b_name;
    Node* next;
};

vector<Branch*> lib;

void Library::start()
{
    int choice = 0;
    do
    {
        cout << "Please select a choice." << endl;
        cout << " " << endl;
        cout << "1. Create a branch and insert its books" << endl;
        cout << "2. Given an author name, a title and a branch name, CHECKOUT that book from the branch." << endl;
        cout << "3. Given an author name, title and a branch name, RETURN that book to the branch." << endl;
        cout << "4. Given an author name, title and branch name, FIND the number of copies of that book are available in that branch." << endl;
        cout << "5. PRINT all books contained in a branch." << endl;
        cout << "6. Exit the program." << endl;

        cin >> choice;

        switch (choice)
        {
        case 1:
            insert();
            break;

        case 5:
            printAll();
            break;

            // TODO: other choises
        }
    } while (choice != 6);
}

void Library::insert()
{
    string br;
    string auth;
    string titl;

    cout << "What is the name of the branch?" << endl;
    cin >> br;

    Branch *branch = new Branch();
    branch->b_name = br;
    lib.push_back(branch);
    Node* lastNode = nullptr;

    do
    {
        cout << "What is the author and title of the book?" << endl;
        cin >> auth >> titl;
        Node *book = new Node();
        book->author = auth;
        book->title = titl;
        book->copies++;
        if (lastNode == nullptr) {
            branch->next = book;
        }
        else {
            lastNode->next = book;
        }
        lastNode = book;
    } while (auth != "NONE" && titl != "NONE");
}

void Library::checkout()
{
    string auth;
    string titl;
    string bran;
}

void Library::Return()
{
    //TODO
}

void Library::find()
{
    //TODO
}

void Library::printAll()
{
    for (unsigned int i = 0; i < lib.size(); i++)
    {
        auto* branch = lib[i];
        auto* node = branch->next;
        while (node)
        {
            cout << "There are " << 
                node->copies << " of " << 
                node->title << " by " << 
                node->author << " in branch " << 
                branch->b_name << endl;
            node = node->next;
        }
    }
}
...