#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 «добавлено» и «голова» заставляет программу зацикливаться на неопределенный срок, выводя «добавлено» на терминал.
'newBook ()' должен гарантировать, что все поля будут инициализированы. Вам не нужно делать 'dummy-> next = NULL;' в 'main()' - это должно быть сделано 'newBook ()'. –
Кроме того, ваш код не компилируется чисто - почему вы отправляете код, который не компилируется? У вас (претензии) есть: 'typedef struct book_t {...; struct Book * next; } Книга; '. Вы не показываете 'struct Book', на который указывает указатель' next', это не 'struct book_t'. Поэтому вы должны получать предупреждения о несоответствиях типа указателя. –
Кроме того, ваш цикл 'while (currentNode-> ISBN> bookToInsert-> ISBN)' никогда не будет выходить, потому что переменные, используемые в состоянии, никогда не меняются внутри цикла. Определенно, вам нужно снова подумать о своей функции «insertToList». –