链接列表插入,删除,排序

时间:2012-02-20 22:12:04

标签: c++ sorting linked-list

很抱歉这是一个相当大的问题。我无法使用以下C ++,我总是得到一个关于在visiual studio的代码中没有struct / class / union的错误。我应该按字母顺序将这些书放入链表中,但到目前为止,我的插入方法已经破了。

    //********************************************************************
    //  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 个答案:

答案 0 :(得分:1)

好吧,跳出来的逻辑错误是你永远不会说

node->next = current->next

current->next = node

当然,有链接列表的STL库,你的打印功能没有边界检查(无论如何应该使用std :: string),这永远不会清理它分配的内存......但是我假设这是一个介绍编程任务。如果没有定义delet()方法,您将无法实例化您的类。

答案 1 :(得分: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 *。使用以下内容,它编译好我。如果没有使用类的主函数,我无法告诉您代码是否在逻辑上正常工作但现在编译。

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

答案 2 :(得分:0)

在开始声明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不是struct / class / union。

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