2013-05-07 2 views
1

Учитывая структуру книга определяется следующим образом и массив 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] , Поэтому, учитывая автора «Автор1», функция должна возвращать 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;} 
} 

Я попытался запустить код с приведенным выше примером, автором = «Author1» и продолжал получать неправильный вывод. Функция всегда возвращает 55 вместо 90, и я не могу понять, почему. Любая помощь приветствуется, спасибо!

ответ

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; 
} 
+0

О, я вижу, спасибо! Можете ли вы рассказать мне, как меняются члены lib в моем коде? – drawar

+0

Добро пожаловать. Предполагая, что 'lib' является глобальной переменной, строка' lib [i] = * (lib [i] .nextedition) ', похоже, изменит ее. – simonc

+0

У меня получилось, спасибо, что поняли, что для меня! – drawar

Смежные вопросы