指针和结构

时间:2013-05-07 16:32:34

标签: c pointers data-structures

给定结构 book 定义如下,结构书的数组 lib

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),并且给作者“作者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,我似乎无法弄清楚原因。感谢任何帮助,谢谢!

1 个答案:

答案 0 :(得分: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;
}