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

时间:2016-10-09 02:47:10

标签: c data-structures file-handling

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

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

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
#include<Windows.h>

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 < root->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 < root->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();
}

}

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

1 个答案:

答案 0 :(得分:0)

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

我认为主要的罪魁祸首是结构,尤其是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应直接放在结构

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

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();
    }