我的图书馆目录C程序可以帮助我吗?

我需要使用BST和文件处理,但我坚持使用这个,因为displayCatalog函数似乎不起作用。

我想在将结构打印到文件之前先建立结构。 我该怎么做?

#include #include #include #include #include typedef struct book catalog; FILE *fx,*fy; struct book{ char title[20]; char author[20]; int isbn[15]; char genre[10]; char publisher[20]; int year[5]; char synopsis[100]; catalog *left; catalog *right; }; catalog *root; void addBooks(); void removeBooks(); // void modify(); // void searchBook(); // void perTitle(); // void perAuthor(); // void perISBN(); // void perGenre(); // void displayCatalog(catalog *root); // int ifexists(char *x); void insert(catalog *root,catalog *x); catalog remove(catalog *root,catalog *x); void menu(); void gotoxy(int x,int y); void main(){ root=NULL; menu(); } void menu(){ int choice; system("cls"); gotoxy(22,5); printf("----------WELCOME TO THE CARD CATALOG----------"); gotoxy(22,7); printf("1] Add a book"); gotoxy(22,8); printf("2] Remove a book"); gotoxy(22,9); printf("3] Modify a book"); gotoxy(22,10); printf("4] Search a book"); gotoxy(22,11); printf("5] Display the catalog"); gotoxy(22,12); printf("6] Exit"); gotoxy(22,14); printf("Enter your choice: "); scanf("%d",&choice); switch(choice){ case 1: addBooks(); break; case 2: removeBooks(); break; case 3: modify(); break; case 4: searchBook(); break; case 5: displayCatalog(root); break; case 6: exit(0); } } void addBooks(){ char y; catalog *ptr; ptr=(catalog*)malloc(sizeof(catalog)); system("cls"); gotoxy(22,8); printf("Title: "); scanf("%s",ptr->title); gotoxy(22,9); printf("Author: "); scanf("%s",ptr->author); gotoxy(22,10); printf("Genre: "); scanf("%s",ptr->genre); gotoxy(22,11); printf("ISBN: "); scanf("%s",ptr->isbn); gotoxy(22,12); printf("Publisher: "); scanf("%s",ptr->publisher); gotoxy(22,13); printf("Year: "); scanf("%s",ptr->year); gotoxy(22,14); printf("Synopsis: "); scanf("%s",ptr->synopsis);fflush(stdin); ptr->left=NULL; ptr->right=NULL; if(root==NULL){ root=ptr; } else { insert(root,ptr); } menu(); } void insert(catalog *root,catalog *x){ if(x->isbn isbn){ if(root->left==NULL){ root->left=x; } else { insert(root->left,x); } } if(x->isbn > root->isbn){ if(root->right==NULL){ root->right=x; } else { insert(root->right,x); } } } void removeBooks(){ catalog *ptr,*temp; int x; char title[20],y; system("cls"); if(root==NULL){ gotoxy(22,10); printf("No records to show..."); getch(); menu(); } gotoxy(22,10); printf("Enter title of book to delete: "); scanf("%s",title); ptr=root; while(ptr!=NULL){ if(strcmp(ptr->title,title)==0){ gotoxy(22,11); printf("The book is in the catalog."); gotoxy(22,12); printf("Title: %s",root->title); gotoxy(22,13); printf("Author: %s",root->author); } else { gotoxy(22,11); printf("No book with that title in the catalog."); getch(); menu(); } if(strcmp(ptr->title,title)==0){ gotoxy(22,14); printf("Remove book record? (y/n) "); if(getch()=='y'){ remove(root,ptr); menu(); } else { menu(); } } } } catalog remove(catalog *root,catalog *x){ catalog *temp; char y; if(x==root){ temp=root; free(temp); root=NULL; } else if(x->isbn isbn){ *root->left=remove(root->left,x); } else if(x->isbn > root->isbn){ *root->right=remove(root->right,x); } else if(root==NULL){ gotoxy(22,10); printf("Nothing to remove..."); getch(); menu(); } printf("The book has been removed."); printf("Remove another book? (y/n) "); scanf("%c",&y); return *x; } void modify(){ catalog *ptr; int num; char title[20]; system("cls"); if(root==NULL){ printf("No records exist..."); getch(); menu(); } printf("Enter title of book to be modified: "); scanf("%s",title); ptr=root; while(ptr!=NULL){ if(strcmp(ptr->title,title)==0){ printf("Input new information."); printf("Title: "); scanf("%s",root->title); printf("Author: "); scanf("%s",root->author); printf("ISBN: "); scanf("%d",root->isbn); printf("Publisher: "); scanf("%s",root->publisher); printf("Year: "); scanf("%d",root->year); printf("Synopsis: "); scanf("%s",root->synopsis); printf("The book's information has been modified."); } else { printf("No book found."); break; } } getch(); menu(); } void searchBook(){ int choice; char title[20], author[20]; int num; system("cls"); if(root==NULL){ printf("No records to show..."); getch(); menu(); } gotoxy(22,10); printf("-----SEARCH A BOOK-----"); gotoxy(22,12); printf("1] By title"); gotoxy(22,13); printf("2] By author"); gotoxy(22,14); printf("3] By ISBN"); gotoxy(22,15); printf("4] Back to menu"); gotoxy(22,18); printf("Enter your choice: "); scanf("%d",&choice); switch(choice){ case 1: perTitle(); break; case 2: perAuthor(); break; case 3: perISBN(); break; case 4: perGenre(); break; case 5: menu(); } } void perTitle(){ catalog *ptr; char title[20],ans; system("cls"); gotoxy(22,15); printf("Enter book title: "); scanf("%s",title); ptr=root; while(strcmp(ptr->title,title)!=0){ ptr=ptr->left; if(ptr==NULL) menu(); } system("cls"); if(ptr!=NULL){ gotoxy(22,10); printf("That book is in the catalog."); gotoxy(22,11); printf("Title: %s",ptr->title); gotoxy(22,12); printf("Author: %s",ptr->author); gotoxy(22,13); printf("ISBN: %d",ptr->isbn); gotoxy(22,14); printf("Genre: %s",ptr->genre); gotoxy(22,15); printf("Publisher: %s",ptr->publisher); gotoxy(22,16); printf("Year: %d",ptr->year); gotoxy(22,17); printf("Synopsis: %s",ptr->synopsis); } else { gotoxy(22,10); printf("No records to show..."); } printf("Try another? (y/n) "); scanf("%c",&ans); switch(ans){ case 'y': searchBook(); break; case 'n': menu(); } } void perAuthor(){ catalog *ptr; char author[20],ans; system("cls"); gotoxy(22,15); printf("Enter book title: "); scanf("%s",author); ptr=root; while(strcmp(ptr->author,author)!=0){ ptr=ptr->left; if(ptr==NULL) menu(); } system("cls"); if(ptr!=NULL){ gotoxy(22,10); printf("That book is in the catalog."); gotoxy(22,11); printf("Title: %s",ptr->title); gotoxy(22,12); printf("Author: %s",ptr->author); gotoxy(22,13); printf("ISBN: %d",ptr->isbn); gotoxy(22,14); printf("Genre: %s",ptr->genre); gotoxy(22,15); printf("Publisher: %s",ptr->publisher); gotoxy(22,16); printf("Year: %d",ptr->year); gotoxy(22,17); printf("Synopsis: %s",ptr->synopsis); } else { gotoxy(22,10); printf("No records to show..."); } printf("Try another? (y/n) "); scanf("%c",&ans); switch(ans){ case 'y': searchBook(); break; case 'n': menu(); } } void perISBN(){ catalog *ptr; int isbn[20]; char ans; system("cls"); gotoxy(22,15); printf("Enter book ISBN: "); scanf("%s",isbn); ptr=root; while(ptr->isbn==isbn){ ptr=ptr->left; if(ptr==NULL) menu(); } system("cls"); if(ptr!=NULL){ gotoxy(22,10); printf("That book is in the catalog."); gotoxy(22,11); printf("Title: %s",ptr->title); gotoxy(22,12); printf("Author: %s",ptr->author); gotoxy(22,13); printf("ISBN: %d",ptr->isbn); gotoxy(22,14); printf("Genre: %s",ptr->genre); gotoxy(22,15); printf("Publisher: %s",ptr->publisher); gotoxy(22,16); printf("Year: %d",ptr->year); gotoxy(22,17); printf("Synopsis: %s",ptr->synopsis); } else { gotoxy(22,10); printf("No records to show..."); } printf("Try another? (y/n) "); scanf("%c",&ans); switch(ans){ case 'y': searchBook(); break; case 'n': menu(); } } void perGenre(){ catalog *ptr; char genre[20],ans; system("cls"); gotoxy(22,15); printf("Enter book title: "); scanf("%s",genre); ptr=root; while(strcmp(ptr->genre,genre)!=0){ ptr=ptr->left; if(ptr==NULL) menu(); } system("cls"); if(ptr!=NULL){ gotoxy(22,10); printf("That book is in the catalog."); gotoxy(22,11); printf("Title: %s",ptr->title); gotoxy(22,12); printf("Author: %s",ptr->author); gotoxy(22,13); printf("ISBN: %d",ptr->isbn); gotoxy(22,14); printf("Genre: %s",ptr->genre); gotoxy(22,15); printf("Publisher: %s",ptr->publisher); gotoxy(22,16); printf("Year: %d",ptr->year); gotoxy(22,17); printf("Synopsis: %s",ptr->synopsis); } else { gotoxy(22,10); printf("No records to show..."); } printf("Try another? (y/n) "); scanf("%c",&ans); switch(ans){ case 'y': searchBook(); break; case 'n': menu(); } } void displayCatalog(catalog *root){ catalog *ptr; system("cls"); ptr=root; while(ptr!=NULL){ displayCatalog(root->left); printf("Title: %s",ptr->title); printf("Author: %s",ptr->author); printf("ISBN: %d",ptr->isbn); printf("Genre: %s",ptr->genre); printf("Publisher: %s",ptr->publisher); printf("Year: %d",ptr->year); printf("Synopsis: %d",ptr->synopsis); displayCatalog(root->right); } menu(); } void gotoxy(int x,int y){ COORD coord; coord.X=x; coord.Y=y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); } 

更新:所以我编辑了我的代码的BIT,以便它已经可以显示。 但是,比较用户输入的字符串和我的struct中的字符串似乎存在问题,因为perTitle,perAuthor和perGenre函数将不起作用。 perISBN工作得非常好。

以下是perTitle()现在的样子:

 void perTitle(){ catalog *ptr; char title[20],ans; system("cls"); gotoxy(22,15); printf("Enter book title: "); scanf("%s",title);fflush(stdin); ptr=root; while(strcmp(ptr->title,title)!=0){ system("cls"); if(ptr!=NULL){ gotoxy(22,10); printf("That book is in the catalog."); gotoxy(22,11); printf("Title: %s",ptr->title); gotoxy(22,12); printf("Author: %s",ptr->author); gotoxy(22,13); printf("ISBN: %d",ptr->isbn); gotoxy(22,14); printf("Genre: %s",ptr->genre); gotoxy(22,15); printf("Publisher: %s",ptr->publisher); gotoxy(22,16); printf("Year: %d",ptr->year); gotoxy(22,17); printf("Synopsis: %s",ptr->synopsis); } else { gotoxy(22,10); printf("No records to show..."); } } printf("Try another? (y/n) "); scanf("%c",&ans); switch(ans){ case 'y': searchBook(); break; case 'n': menu(); } 

}

鉴于我已将书记录添加到列表中,它始终显示“尝试另一个(是/否)?”

代码中有很多错误(这让我甚至不知道它会编译)并且你的编译器应该发出很多警告,如果你愿意的话。

我认为主要的罪魁祸首是结构,特别是在int部分。 int isbn[15]保留了15个int的数组,这不是你想要的。 任何ISBN都需要多个int (假设每个int 4个字节,每个字节8个比特),所以使用一个字符串作为开始。 只需将int更改为char 。 另外: int year[5]将为五个int做一个数组,但我很确定一个是足够的(再次:假设每个int 4个字节,每个字节8位)。 所以你的结构现在

 struct book{ char title[20]; char author[20]; char isbn[14]; // 13 digits max. plus NUL char genre[10]; char publisher[20]; int year; char synopsis[100]; catalog *left; catalog *right; }; 

注意: typedef应该直接放在struct下面

您还需要更改年份的方式:

 scanf("%d",&ptr->year); 

而插入函数中的比较现在需要能够比较字符串,所以

 void insert(catalog *root,catalog *x){ if(strcmp(x->isbn, root->isbn) < 0){ if(root->left==NULL){ root->left=x; } else { insert(root->left,x); } } if( strcmp(x->isbn, root->isbn) > 0){ if(root->right==NULL){ root->right=x; } else { insert(root->right,x); } } } 

如果没有更大的重写(我没有带编译器的Windows),我无法测试它,所以要小心打字错误。 并且代码中还有更多错误,因此它可能仍然无法正常工作,尽管时间原因不同。

树遍历也有点搞砸了

 void displayCatalog(catalog *root123){ catalog *ptr; system("cls"); ptr=root123; while(ptr!=NULL){ if(root123->left != NULL){ displayCatalog(root123->left); } printf("Title: %s\n",ptr->title); printf("Author: %s\n",ptr->author); printf("ISBN: %s\n",ptr->isbn); printf("Genre: %s\n",ptr->genre); printf("Publisher: %s\n",ptr->publisher); printf("Year: %d\n",ptr->year); printf("Synopsis: %s\n",ptr->synopsis); if(root123->right != NULL){ displayCatalog(root123->right); } break; } menu(); }