Вставка связанного списка, удаление, сортировка - PullRequest
0 голосов
/ 21 февраля 2012

Извините, что это довольно большой вопрос.Я не могу заставить работать следующий C ++, я всегда получаю ошибку об отсутствии структуры / класса / union в коде из visiual studio.Предполагается, что книги будут помещены в связанный список в алфавитном порядке, но пока мой метод вставки не работает.

    //********************************************************************
    //  BookList.cpp
    //
    //  Represents a collection of books.
    //*******************************************************************
    #include "BookList.h"

    //----------------------------------------------------------------
    //  Creates a new Book object and adds it to the end of
    //  the linked list.
    //----------------------------------------------------------------
    void BookList::add(Book *newBook) {

    BookNode *node = new BookNode(newBook);
    BookNode *current;

    if (head == NULL)
    head = node;
    else {
       current = head;
       while (current->next != NULL) {
           current = current->next;
       }
       current->next = node;
    }
    }

    char *BookList::getBookList(char *list) {

       list[0] = '\0';
       BookNode *current = head;

       while (current != NULL) {
          strcat( list, current->book->getBook() );
          strcat( list, "\n" );
          current = current->next;
          }

       return list;
       }

    void BookList::insert(Book *newBook) {
        BookNode *node = new BookNode(newBook);
        BookNode *current;

        if (head == NULL) {
    head = node;
        }
        else {
            current = head;
            int result = *newBook.compareTo(current->book->getBook());
            if (result == -1) {
                current->next = node;
                }
            else {
                while (result == 1) {
                    current = current->next;
                    result = *newBook.compareTo(current->book->getBook());
        }
    current->next = node;
    }
    }
    }

    //********************************************************************
    //  BookList.h
    //
    //  Represents a collection of books.
    //*******************************************************************
    #include "Book.h"

    class BookNode {
       public:
          BookNode() { };
          BookNode(Book *theBook) {
             book = theBook;
             next = NULL;
          };
          friend class BookList;

       private:
          Book *book;
          BookNode *next;
    };

    class BookList {
       public:
          void add(Book *);
          char* getBookList(char *);
      void delet(Book *);
      void insert(Book *);
          BookList() {
          head = NULL;
          };

       private:
          BookNode *head;

     };

    #include <cstring>

    //********************************************************************
    //  Book.h
    //
    //  Represents a single book.
    //*******************************************************************

    class Book {

       public:
          Book (char *newTitle) {
             strcpy( title, newTitle );
          }

          int compareTo(Book *newBook) {
              int compvar;
                      compvar = strcmp(newBook->getBook(), title);
                      return compvar;
          }

          char *getBook() {
             return title;
          }

       private:
          char title[81];

       };

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

Ответы [ 3 ]

1 голос
/ 21 февраля 2012

Эта строка кода неправильная (две строки, которые выглядят так же):

int result = *newBook.compareTo(current->book->getBook());

Если вы разыграете, используйте круглые скобки:

int result = (*newBook).compareTo(current->book->getBook());

Но чтобы было легче читать, я бы предложил:

int result = newBook->compareTo(current->book->getBook());

Это должно показать вам вашу реальную проблему: compareTo () ожидает объект Book, а getBook () возвращает символ *. Используйте следующее, и это хорошо для меня. Без основной функции, которая использует классы, я не могу сказать вам, правильно ли работает ваш код, но теперь он компилируется.

Вы должны действительно перегрузить оператор равенства в Book.h для сравнения. Надеюсь это поможет.

1 голос
/ 21 февраля 2012

Ну, логическая ошибка, которая выскакивает у меня в том, что вы никогда не говорите

node->next = current->next

до

current->next = node

Конечно, есть библиотеки STL для связанных списков, нетпроверка границ в вашей функции печати (которая, вероятно, в любом случае должна использовать std :: string), и это никогда не очищает память, которую она выделяет ... но я предполагаю, что это для начального программирования.Вы не сможете создать экземпляр своего класса без определенного метода delet ().

0 голосов
/ 21 февраля 2012

Вам необходимо добавить предварительное объявление класса BookList, прежде чем начать объявлять класс BookNode, поскольку у вас есть строка friend class BookList; внутри определения вашего BookNode класса.

Изменитеследующее:

//********************************************************************
//  BookList.h
//
//  Represents a collection of books.
//*******************************************************************
#include "Book.h"

class BookNode {

на это:

//********************************************************************
//  BookList.h
//
//  Represents a collection of books.
//*******************************************************************
#include "Book.h"

class BookList;

class BookNode {

Без этого компилятор будет жаловаться, что BookList не является структурой / классом / объединением.

Очевидно,после этого вам придется избавиться от других ошибок компилятора в вашем коде.

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