1

给定一个结构定义如下和一个结构书的数组

struct Book{
    char title[100];
    char author[100];
    int price;
    struct Book *nextedition;
};


struct Book lib[1000];

我将编写一个函数来计算给定作者的书籍总价格,包括他的书的未来版本的所有书籍,即使该未来版本的作者不是指定的作者。

   title    author  price   nextedition
----------------------------------
0  Book1    Author1 25      &lib[2]
1  Book2    Author2 20      NULL
2  Book3    Author3 30      &lib[3]
3  Book4    Author1 35      NULL

对于上面的示例,位于 lib[2] 的书是位于 lib[0] 的书的下一个版本,位于 lib[4] 的书是位于 lib[2] 的书的下一个版本。因此,给定作者“Author1”,该函数应返回 90 (=25+30+35),给定作者“Author 3”,该函数应返回 65 (=30+35)。

所以这是我的代码:

int firstEdition(char author[100]){
    int i, pos=-1;
    for(i=0;i<numbooks;i++)
    if(strcmp(lib[i].author,author)==0){
        pos=i;
        if(pos>=0) return pos;
    }
    return -1;
}

int totalPrice(char author[100]){
    int price=0;
    int i=firstEdition(author);
    if (i<0)
        return 0;
    else {      
        while (lib[i].nextedition != NULL){
            price+=lib[i].price;
            lib[i]=*(lib[i].nextedition);
        }
    return price;}
}

我已经尝试使用上面的示例和 author="Author1" 运行代码并不断得到错误的输出。该函数总是返回55而不是90,我似乎无法弄清楚为什么。任何帮助表示赞赏,谢谢!

4

1 回答 1

1

在考虑列表中最后一本书的价格之前,您的实现totalPrice退出了它的while循环。它还改变了一些lib显然不受欢迎的成员。

以下(未经测试的)代码应该在price不改变状态的情况下为您提供正确的lib

int totalPrice(char author[100]){
    int price=0;
    int i=firstEdition(author);
    struct Book *book;
    if (i<0)
        return 0;
    book = &lib[i];
    while (book != NULL) {
        price+=book->price;
        book = book->nextedition;
    }
    return price;
}
于 2013-05-07T16:38:52.060 回答