很抱歉这是一个相当大的问题。我无法使用以下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];
};
此代码肯定存在多个问题,因此任何人都可以提供的任何帮助都会非常棒。提前谢谢!
答案 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。
显然,在执行此操作后,您必须清除代码中的其他编译器错误。