【问题标题】:Linked List Insertion, deletion, sorting链表插入、删除、排序
【发布时间】:2012-02-20 22:12:04
【问题描述】:

抱歉,这是一个相当大的问题。我无法让以下 C++ 工作,我总是收到一个错误,即在来自视觉工作室的代码中没有结构/类/联合。我应该按字母顺序将书籍放入链表中,但到目前为止我的插入方法已损坏。

    //********************************************************************
    //  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];

       };

此代码肯定存在多个问题,因此任何人都可以提供的任何帮助都很棒。提前致谢!

【问题讨论】:

  • 它是否给出了一个行号来查看?如果是这样,你能指出源代码中的问题吗?这将有很大帮助。
  • 您想要code review,还是有具体问题可以描述?
  • 你不应该在没有调试的情况下让它变得这么大。 永远不要添加不起作用的代码。
  • 你有一个测试输入用例,你得到什么列表?
  • 只挑剔:1) 成员函数定义后没有分号。 2)你在std::strcpy等几个函数前面忘记了std::。 3) 不要使用strcpy。 4) 不要说81

标签: c++ sorting linked-list


【解决方案1】:

这行代码是错误的(两行看起来像这样):

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

如果您取消引用,请在其周围使用括号:

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

但为了便于阅读,我建议:

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

这应该告诉你你真正的问题:compareTo() 需要一个 Book 对象,而 getBook() 返回一个 char *。使用以下内容,它对我来说编译得很好。如果没有使用这些类的 main 函数,我无法告诉您您的代码在逻辑上是否可以正常工作,但现在它可以编译了。

您真的应该重载 Book.h 中的相等运算符以进行比较。希望这可以帮助。

【讨论】:

  • 谢谢!每个人的帮助都非常有助于使该程序恢复正常运行,但您的帮助是最大的难题。再次感谢!
【解决方案2】:

好吧,我跳出来的逻辑错误是你从来没有说过

node->next = current->next

之前

current->next = node

当然,有用于链表的 STL 库,在您的打印函数中没有边界检查(无论如何应该使用 std::string),而且这永远不会清理它分配的内存......但是我认为这是一个介绍性编程任务。如果没有定义 delete() 方法,您将无法实例化您的类。

【讨论】:

    【解决方案3】:

    您需要在开始声明 BookNode 类之前添加 BookList 类的前向声明,因为您的 BookNodeclass 定义中有 friend class BookList; 行。

    更改以下内容:

    //********************************************************************
    //  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 不是结构/类/联合。

    显然,您必须在执行此操作后摆脱代码中的其他编译器错误。

    【讨论】:

    • 谢谢!这是我的程序无法运行的部分原因。
    猜你喜欢
    • 1970-01-01
    • 2014-11-14
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-16
    • 2016-08-26
    相关资源
    最近更新 更多