2015-12-08 2 views
2
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <stdbool.h> 
#include "Book.h" 


int main(int argc, char** argv) { 

    Book * dummy = newBook("dummy", "dummy", 00000); 

    printf("%s %s %ld", dummy->title, dummy->author, dummy->ISBN); 

    dummy->next = NULL; 


    Book* newishBook = newBook("Foo", "Chris", 1234); 
    insertToList(newishBook, dummy); 

    Book* another = newBook("Bar", "Jim", 23344); 
    insertToList(another, dummy); 

    Book* yet = newBook("Derp", "Bob", 999); 
    insertToList(yet, dummy); 

    displayList(dummy); 

    searchISBN(999); 

    return (EXIT_SUCCESS); 
} 

Book* newBook(char* newTitle, char* newAuthor, long newISBN) { 
    Book* new_book = malloc(sizeof(Book)); 

    strcpy(new_book->title, newTitle); 
    strcpy(new_book->author, newAuthor); 
    new_book->ISBN = newISBN; 
    return new_book; 
} 



void insertToList(Book* bookToInsert, Book* dummy){ 
    Book* currentNode = dummy; 
    Book* temp = malloc(sizeof(Book)); 

    if (currentNode->next == NULL){ 
     currentNode->next = bookToInsert; 
     printf("Head"); 
    } else { 
     currentNode= currentNode->next;   
     while(currentNode->ISBN > bookToInsert->ISBN){ 

      if (bookToInsert ->ISBN < currentNode->ISBN){ 
       // if isbn of current book more than current node, move to next current node 
       //otherwise add here 
       printf("Added"); 
       temp->next = currentNode->next; 
       bookToInsert->next = currentNode->next; 
       currentNode->next = temp->next; 
      } 
     } 
    } 
} 

void displayList(Book* dummy){ 
    //start at dummy node- 
    Book* currentNode = dummy; 
    bool run = true; 

    //print until next = null 
    while(run==true){ 
     if (currentNode->next != NULL){ 
      printf("%s %s %ld \n", currentNode->title, currentNode->author, currentNode->ISBN); 
      currentNode = currentNode ->next; 
     } else { 
      run = false; 
     } 
    }  
} 

Эта программа предназначена для создания книжных структур, являющихся узлами связанного списка. Книга определяются следующим образом в файл заголовок Book.h:Связанные списки в C-добавлении структуры в отсортированном виде

#ifndef BOOK_H 
#define BOOK_H 

#ifdef __cplusplus 
extern "C" { 
#endif 


typedef struct book_t { 
    char title[50]; 
    char author[30]; 
    long ISBN; 
    struct Book *next; 
} Book; 

Book* newBook(char* newTitle, char* newAuthor, long newISBN); 

#ifdef __cplusplus 
} 
#endif 

#endif /* BOOK_H */ 

Я чувствую, что моя функция insertToList близок к работе, но у меня есть код-слепота, глядя на него тоже не так, и я Конечно, в этом что-то действительно не так. В настоящее время нет выхода - только пустой терминал, я считаю, что цикл не выходит должным образом. Разоблачение статусов printf «добавлено» и «голова» заставляет программу зацикливаться на неопределенный срок, выводя «добавлено» на терминал.

+0

'newBook ​​()' должен гарантировать, что все поля будут инициализированы. Вам не нужно делать 'dummy-> next = NULL;' в 'main()' - это должно быть сделано 'newBook ​​()'. –

+3

Кроме того, ваш код не компилируется чисто - почему вы отправляете код, который не компилируется? У вас (претензии) есть: 'typedef struct book_t {...; struct Book * next; } Книга; '. Вы не показываете 'struct Book', на который указывает указатель' next', это не 'struct book_t'. Поэтому вы должны получать предупреждения о несоответствиях типа указателя. –

+1

Кроме того, ваш цикл 'while (currentNode-> ISBN> bookToInsert-> ISBN)' никогда не будет выходить, потому что переменные, используемые в состоянии, никогда не меняются внутри цикла. Определенно, вам нужно снова подумать о своей функции «insertToList». –

ответ

1

Структура должна быть:

typedef struct Book { 
    char title[50]; 
    char author[30]; 
    long ISBN; 
    struct Book *next; 
} Book; 

Код может быть:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include "Book.h" 

Book *newBook(char *newTitle, char *newAuthor, long newISBN); 
void displayList(Book *dummy); 
void insertToList(Book *bookToInsert, Book *dummy); 
void freeList(Book *head); 

int main(void) 
{ 
    Book *dummy = newBook("dummy", "dummy", 00000); 

    printf("%s %s %ld\n", dummy->title, dummy->author, dummy->ISBN); 

    printf("Newish\n"); 
    Book *newishBook = newBook("Foo", "Chris", 1234); 
    insertToList(newishBook, dummy); 
    displayList(dummy); 

    printf("Another\n"); 
    Book *another = newBook("Bar", "Jim", 23344); 
    insertToList(another, dummy); 
    displayList(dummy); 

    printf("Yet\n"); 
    Book *yet = newBook("Derp", "Bob", 999); 
    insertToList(yet, dummy); 
    displayList(dummy); 

    //searchISBN(999); 
    freeList(dummy); 

    return(EXIT_SUCCESS); 
} 

Book *newBook(char *newTitle, char *newAuthor, long newISBN) 
{ 
    Book *new_book = malloc(sizeof(Book)); 

    strcpy(new_book->title, newTitle); 
    strcpy(new_book->author, newAuthor); 
    new_book->ISBN = newISBN; 
    new_book->next = NULL; 
    return new_book; 
} 

void insertToList(Book *bookToInsert, Book *dummy) 
{ 
    Book *currentNode = dummy; 

    while (currentNode->next != NULL && currentNode->next->ISBN < bookToInsert->ISBN) 
     currentNode = currentNode->next; 
    bookToInsert->next = currentNode->next; 
    currentNode->next = bookToInsert; 
} 

void displayList(Book *dummy) 
{ 
    Book *currentNode = dummy; 

    while (currentNode != NULL) 
    { 
     printf("%s %s %ld\n", currentNode->title, currentNode->author, currentNode->ISBN); 
     currentNode = currentNode->next; 
    } 
} 

void freeList(Book *head) 
{ 
    Book *bp = head; 
    while (bp != 0) 
    { 
     Book *bn = bp->next; 
     free(bp); 
     bp = bn; 
    } 
} 

Это работает без утечек под valgrind благодаря функции freeList() добавляются и используются ,

Обратите внимание, как список печатается после добавления каждой записи. Это помогает гарантировать правильность построения списка. Также обратите внимание, как каждая строка вывода заканчивается символом новой строки. Вы не будете видеть печатные данные, пока не напечатаете новую строку. Для отладки, в частности, убедитесь, что вы включили новые строки, но, как правило, это хорошая идея, даже если не отладка.

1

insertToList функция не обрабатывает все случаи.

вы начинаете с проверки того, что список пуст (правильный) В цикле while отсутствует логика. Вы должны:

1) check if currentNode is larger (same as your if statement) 
    a) if it is smaller, insert the book, 
    b) if it is larger, you need another check: 
     i) if currentNode has next !== NULL, move down and repeat loop 
     ii) if next == NULL, add book at the end and return; 
Смежные вопросы