歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux技術 >> Linux下,用單鏈表編寫圖書管理系統

Linux下,用單鏈表編寫圖書管理系統

日期:2017/3/3 12:44:58   编辑:Linux技術
[code]/*****************************************************
copyright (C), Nanjing University of Tecnology
File name:Book_managmentSystem.c
Author: Xiecan  Version:0.2    Date: 2016-04-16 11:44
Description:
Funcion List: 
*****************************************************/

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>

#define M 10
#define N 15

typedef struct book_info
{
    char ISBN
;//書號
    char name[M];//書名
    char writer[M];//作者
    char time[M];//出版日期
    char publisher
;//出版社
    char price[M];//價格
}Book;

typedef struct link
{
    Book info;
    struct link * next;

}Node,*Link;

void Add_book(Link *Head,Link *New);//添加圖書信息函數原型聲明
void Delete_book(Link *Head);       //刪除圖書信息函數原型聲明
void Find_book(Link *Head);         //查找圖書信息函數原型聲明
void Update_book(Link *Head);       //修改圖書信息函數原型聲明
void Print_book(Link *Head);        //輸出圖書信息函數原型聲明

/*添加數據子操作*/
void print_info(Link *New,int i);

/*刪除子操作*/
void delete_ISBN(Link *Head);
void delete_name(Link *Head);
void delete_writer(Link *Head);
void delete_publisher(Link *Head);

/*查找子操作*/
void search_ISBN(Link *Head);
void search_name(Link *Head);
void search_writer(Link *Head);
void search_publisher(Link *Head);
void search_price(Link *Head);
void search_time(Link *Head);

/*修改子操作*/
void update_ISBN(Link *p);
Link update_name(Link p);
Link update_writer(Link p);
Link update_publisher(Link p);
Link update_price(Link p);
Link update_time(Link p);

void choose_op(Link *Head);

/*輸出一本圖書的信息*/
void print(Link *Head);

/*圖書管理系統菜單*/
void Menus(Link *Head,Link *New);

int main(int argc, char **argv)
{
    FILE * fp;
    int bytes_read,bytes_write;

    Link Head = NULL,p;      //節點聲明
    Link New = NULL;
    int c = 1;
    p = Head;

    Head = (Link)malloc(sizeof(Node));//建立頭節點
    Head->next = NULL;                //空鏈表

    while(c)
    {
        Menus(&Head,&New);

        printf("你想繼續操作嗎?\
              \n1.繼續\
              \n2.退出\n");
        scanf("%d",&c);

    }
    return 0;
}

/****************************************************
函數功能:選擇菜單
****************************************************/
void Menus(Link *Head,Link *New)
{
    int ch;
    printf("/***************歡迎進入圖書管理系統****************/\n");
    printf("1.添加圖書信息\
          \n2.刪除圖書信息\
          \n3.查找圖書信息\
          \n4.修改圖書信息\
          \n5.輸出圖書管理系統所有圖書信息\
          \n6.退出系統\
          \n/***************************************************/\n");
    scanf("%d",&ch);
    switch(ch)
    {
        case 1:
            Add_book(Head,New);
            Print_book(Head);
            break;
        case 2:
            Delete_book(Head);
            Print_book(Head);
            break;
        case 3:
            Find_book(Head);
            break;
        case 4:
            Update_book(Head);
            break;
        case 5:
            Print_book(Head);
            break;
        case 6:
            exit(0);
        default:
            printf("輸入錯誤,請重新輸入!\n");

    }
}
/****************************************************
函數功能:修改指定圖書的ISBN
****************************************************/
void update_ISBN(Link *p)
{
    printf("請輸入新的ISBN:\n");
    scanf("%s",(*p)->info.ISBN);

}
/****************************************************
函數功能:修改指定圖書的書名
****************************************************/
Link update_name(Link p)
{
    printf("請輸入新的書名:\n");
    scanf("%s",p->info.name);
    return p;
}
/****************************************************
函數功能:修改指定圖書的作者
****************************************************/
Link update_writer(Link p)
{
    printf("請輸入新的作者名字:\n");
    scanf("%s",p->info.writer);
    return p;
}

/****************************************************
函數功能:修改指定圖書的出版社名字
****************************************************/
Link update_publisher(Link p)
{
    printf("請輸入新的出版社名字:\n");
    scanf("%s",p->info.publisher);
    return p;
}

/****************************************************
函數功能:修改指定圖書的價格
****************************************************/
Link update_price(Link p)
{
    printf("請輸入新的價格:\n");
    scanf("%d",p->info.price);
    return p;
}

/****************************************************
函數功能:修改指定圖書的出版日期
****************************************************/
Link update_time(Link p)
{
    printf("請輸入新的出版日期:\n");
    scanf("%s",p->info.time);
    return p;
}

/*****************************************************
函數功能:修改指定圖書的信息
*****************************************************/
void Update_book(Link *Head)
{
    char str
;
    int flag = 0;
    Link p;
    /*輸出錄入圖書的信息*/
    Link q;

    printf("請輸入你要修改圖書的ISBN:\n");//根據ISBN找到指定圖書
    scanf("%s",str);

    p = *Head;

    if(p->next == NULL)//鏈表為空
    {
        printf("沒有圖書,不能進行修改操作.\n");
    }

    while(p->next != NULL)
    {
        if(strcmp(p->next->info.ISBN,str) == 0)//如果p->next->info.ISBN與指定的ISBN號相同,則輸出對應的圖書信息
        {
            flag = 1;
            printf("\n/------------你想要修改圖書的所有信息為----------------/\n");

            /*調用函數顯示指定圖書的所有信息*/
            q = p->next;
            print(&q); 

            /*調用函數選擇修改操作*/
            choose_op(&q);

            break;
        }
        p = p->next;
    }
    if(!flag)
    {
        printf("不能進行修改操作,沒有ISBN為%s的書\n",str);
    }

}

/******************************************************
函數功能:根據需要選擇要進行修改的操作
******************************************************/
void choose_op(Link *p)
{
    int ch;
    Link q;
    q = *p;
    int c = 1;

    while(c)
    {
        c = 0;
        printf("請選擇你想進行的修改操作:\n");
        printf("1.修改ISBN\
              \n2.修改書名\
              \n3.修改作者\
              \n4.修改出版社名\
              \n5.修改書的價格\
              \n6.修改出版日期\n");
        scanf("%d",&ch);

        switch(ch)
        {
            case 1:
                update_ISBN(&q);
                print(&q);
                break;
            case 2:
                update_name(q);
                break;
            case 3:
                update_writer(q);
                break;
            case 4:
                update_publisher(q);
            break;
            case 5:
                update_price(q);
                break;
            case 6:
                update_time(q);
                break;
            default:
                printf("輸入錯誤\n");
        }
C:      printf("還要繼續修改嗎?\
             \n1.繼續\
             \n0.退出\n");
        scanf("%d",&c);
        if(c > 1)
        {
            printf("輸入錯誤,請重新輸入!\n");
            goto C;
        }

    }
    printf("修改後:\n");
    print(p);
}

/*****************************************************
 函數功能:查找指定圖書的信息
 ****************************************************/
void Find_book(Link *Head)
{
    int ch;

    printf("請選擇你想進行的查找操作:\n");
    printf("1.按ISBN查找\
          \n2.按書名查找\
          \n3.查找指定作者的所有書\
          \n4.查找指定出版社出版的所有書\
          \n5.查找書的價格范圍在指定區間的書\
          \n6.查找出版時間在指定區間內的書\n");
    scanf("%d",&ch);

    switch(ch)
    {
        case 1:
            search_ISBN(Head);
            break;
        case 2:
            search_name(Head);
            break;
        case 3:
            search_writer(Head);
            break;
        case 4:
            search_publisher(Head);
            break;
        case 5:
            search_price(Head);
            break;
        case 6:
            search_time(Head);
            break;
        default:
            printf("輸入錯誤\n");
    }

}
/*****************************************************
函數功能:根據ISBN查找圖書信息
*****************************************************/
void search_ISBN(Link *Head)
{
    Link p;
    char str
;
    int flag = 0;

    printf("請輸入你想查找圖書的ISBN:\n");
    scanf("%s",&str);

    p = (*Head)->next;

    if(p == NULL)//鏈表為空
    {
        printf("沒有圖書,不能進行查找操作.\n");
    }

    while(p != NULL)
    {
        if(strcmp(p->info.ISBN,str) == 0)//如果p->next->info.ISBN與指定的ISBN號相同,則輸出對應的圖書信息
        {
            flag = 1;
            printf("\n/------------你查找的圖書信息為----------------/\n");
            print(&p); 
            break;
        }
        p = p->next;
    }
    if(!flag)
    {
        printf("沒有ISBN為%s的書\n",str);
    }

}
/*****************************************************
函數功能:根據書名查找信息
*****************************************************/
void search_name(Link *Head)
{
    Link p;
    char str
;
    int flag = 0;

    printf("請輸入你想查找圖書的書名:\n");
    scanf("%s",&str);

    p = (*Head)->next;

    if(p == NULL)//鏈表為空
    {
        printf("沒有圖書,不能進行查找操作.\n");
    }

    while(p != NULL)
    {
        if(strcmp(p->info.name,str) == 0)//如果p->next->info.name與指定的書名相同,則輸出對應的圖書信息
        {
            flag = 1;
            printf("\n/------------你查找的圖書信息為----------------/\n");
            print(&p); 
            break;
        }
        p = p->next;
    }
    if(!flag)
    {
        printf("沒有書名為%s的書\n",str);
    }
}
/*****************************************************
函數功能:查找指定圖書作者寫的圖書信息
*****************************************************/
void search_writer(Link *Head)
{
    Link p;
    char str
;
    int flag = 0;

    printf("請輸入你想查找圖書的作者:\n");
    scanf("%s",&str);

    p = (*Head)->next;

    if(p == NULL)//鏈表為空
    {
        printf("沒有圖書,不能進行查找操作.\n");
    }

    while(p != NULL)
    {
        if(strcmp(p->info.writer,str) == 0)//如果p->next->info.writer與指定的作者相同,則輸出對應的圖書信息
        {
            flag = 1;
            printf("\n/------------你查找的圖書信息為----------------/\n");
            print(&p); 
            break;
        }
        p = p->next;
    }
    if(!flag)
    {
        printf("沒有作者%s的書\n",str);
    }
}
/*****************************************************
函數功能:查找指定出版社出版的圖書信息
*****************************************************/
void search_publisher(Link *Head)
{
    Link p;
    char str
;
    int flag = 0;

    printf("請輸入你想查找圖書的出版社名字:\n");
    scanf("%s",&str);

    p = (*Head)->next;

    if(p == NULL)//鏈表為空
    {
        printf("沒有圖書,不能進行查找操作.\n");
    }

    while(p != NULL)
    {
        if(strcmp(p->info.publisher,str) == 0)//如果p->next->info.publisher與指定的出版社名字相同,則輸出對應的圖書信息
        {
            flag = 1;
            printf("\n/------------你查找的圖書信息為----------------/\n");
            print(&p); 
            break;
        }
        p = p->next;
    }
    if(!flag)
    {
        printf("沒有出版社%s的書\n",str);
    }
}
/*****************************************************
函數功能:查找圖書價格在指定區間上的書
*****************************************************/
void search_price(Link *Head)
{
    Link p;
    int a,b;
    int flag = 0;

    printf("請輸入你想查找圖書價格的下限:\n");
    scanf("%d",&a);
    printf("請輸入你想查找圖書的上限:\n");
    scanf("%d",&b);

    p = (*Head)->next;

    if(p == NULL)//鏈表為空
    {
        printf("沒有圖書,不能進行查找操作.\n");
    }

    while(p != NULL)
    {
        if((p->info.price >= a) && (p->info.price <= b))//如果p->next->info.price在指定的區間[a,b]內,則輸出對應的圖書信息
        {
            flag = 1;
            printf("\n/------------價格位於[%d,%d]內圖書信息為----------------/\n",a,b);
            print(&p); 
            break;
        }
        p = p->next;
    }
    if(!flag)
    {
        printf("沒有圖書價格位於[%d,%d]內的書\n",a,b);
    }
}
/*****************************************************
函數功能:查找出版日期在區間[a,b]中的圖書
*****************************************************/
void search_time(Link *Head)
{
    Link p;
    char a[M],b[M];
    int flag = 0;

    printf("請輸入你想查找圖書出版日期的區間[a,b]:(以逗號隔開)\n");
    scanf("%s,%s",a,b);

    p = (*Head);

    if(p == NULL)//鏈表為空
    {
        printf("沒有圖書,不能進行查找操作.\n");
    }

    while(p != NULL)
    {
        if((p->info.time >= a) && (p->info.time <= b))//如果p->next->info.time在指定的區間[a,b]內,則輸出對應的圖書信息
        {
            flag = 1;
            printf("\n/------------出版日期位於[%s,%s]內圖書信息為----------------/\n",a,b);
            print(&p); 
            break;
        }
        p = p->next;
    }
    if(!flag)
    {
        printf("沒有出版日期位於[%s,%s]內的書\n",a,b);
    }
}
/*****************************************************
函數功能:刪除圖書
*****************************************************/
void Delete_book(Link *Head)
{
    Link p;
    int ch;

    printf("請選擇你想進行的刪除操作:\n");
    printf("1.刪除與指定ISBN相同的書\
          \n2.刪除與指定書名相同的書\
          \n3.刪除指定作者的書\
          \n4.刪除指定出版社的書\n");
    scanf("%d",&ch);

    switch(ch)
    {
        case 1:
            delete_ISBN(Head);
            break;
        case 2:
            delete_name(Head);
            break;
        case 3:
            delete_writer(Head);
            break;
        case 4:
            delete_publisher(Head);
            break;
        default:
            printf("輸入錯誤!\n");
    }
}
/*****************************************************
函數功能:刪除與指定ISBN相同的書
*****************************************************/
void delete_ISBN(Link *Head)
{
    Link p,q;
    char str
;
    int flag = 0;
    printf("請輸入你想刪除圖書的ISBN:\n");
    scanf("%s",&str);

    p = *Head;

    if(p->next == NULL)//鏈表為空
    {
        printf("沒有圖書,不能進行刪除操作.\n");
    }

    while(p->next != NULL)
    {
        if(strcmp(p->next->info.ISBN,str) == 0)//如果p->next->info.ISBN與指定的ISBN號相同,則刪除此圖書節點
        {
            flag = 1;
            q = p->next;
            p->next = q->next;
            free(q);
            break;
        }
        p = p->next;
    }
    if(!flag)
    {
        printf("沒有ISBN為%s的書\n",str);
    }

}
/*****************************************************
函數功能:刪除與指定書名相同的書
*****************************************************/
void delete_name(Link *Head)
{
    Link p,q;
    char str
;
    int flag = 0;
    printf("請輸入你想刪除圖書的名字:\n");
    scanf("%s",&str);

    p = *Head;

    if(p->next == NULL)//鏈表為空
    {
        printf("沒有圖書,不能進行刪除操作.\n");
    }

    while(p->next != NULL)
    {
        if(strcmp(p->next->info.name,str) == 0)//如果p->next->info.ISBN與指定的書名相同,則刪除此圖書節點
        {
            q = p->next;
            p->next = q->next;
            free(q);
            flag = 1;
            break;
        }
        p = p->next;
    }
    if(!flag)
    {
        printf("沒有這本書\n");
    }

}
/*****************************************************
函數功能:刪除指定作者的書
*****************************************************/
void delete_writer(Link *Head)
{
    Link p,q;
    char str
;
    int flag = 0;
    printf("請輸入你想刪除圖書的作者名:\n");
    scanf("%s",&str);

    p = *Head;

    if(p->next == NULL)//鏈表為空
    {
        printf("沒有圖書,不能進行刪除操作.\n");
    }

    while(p->next != NULL)
    {
        if(strcmp(p->next->info.writer,str) == 0)//如果p->next->info.ISBN與指定的作者名相同,則刪除此圖書節點
        {
            q = p->next;
            p->next = q->next;
            free(q);
            flag = 1;
            break;
        }
        p = p->next;
    }
    if(!flag)
    {
        printf("沒有作者%s的書\n",str);
    }

}
/*****************************************************
函數功能:刪除指定出版社的書
*****************************************************/
void delete_publisher(Link *Head)
{
    Link p,q;
    char str
;
    int flag = 0;
    printf("請輸入你想刪除圖書的出版社名字:\n");
    scanf("%s",&str);

    p = *Head;

    if(p->next == NULL)//鏈表為空
    {
        printf("沒有圖書,不能進行刪除操作.\n");
    }

    while(p->next != NULL)
    {
        if(strcmp(p->next->info.publisher,str) == 0)//如果p->next->info.ISBN與指定的出版社名字相同,則刪除此圖書節點
        {
            q = p->next;
            p->next = q->next;
            free(q);
            flag = 1;
            break;
        }
        p = p->next;
    }
    if(!flag)
    {
        printf("沒有%s出版社的書\n",str);
    }
}

/*****************************************************
 函數功能:錄入新的書籍信息
 ****************************************************/
void Add_book(Link *Head,Link *New)
{
    int i;
    int num;
    Link p;
    FILE * fp;

    if((fp = fopen("F:\\book_info.txt","a+")) == NULL)
    {
        perror("書庫文件打開失敗,不能錄入信息!\n");
        exit(1);
    }

    p = (*Head)->next;

    printf("你想錄入幾本書?\n");
    scanf("%d",&num);

    for(i = 0; i < num; i++)
    {
        *New = (Link)malloc(sizeof(Node));
        /*輸入圖書的信息*/
        print_info(New,i,fp);

        /*頭插法插入節點*/
        (*New)->next = (*Head)->next;
        (*Head)->next = *New;
    }
}

/*******************************************************
 函數功能:輸入圖書的信息
*******************************************************/
void print_info(Link *New,int i,FILE *fp)
{
    printf("請輸入第%d本書的信息:\n",i+1);

    printf("ISBN:");
    scanf("%s",&(*New)->info.ISBN);
    fwrite((*New)->info.ISBN,N,1,fp);

    printf("書名:");
    scanf("%s",&(*New)->info.name);
    fwrite((*New)->info.name,M,1,fp);

    printf("作者:");
    scanf("%s",&(*New)->info.writer);
    fwrite((*New)->info.writer,M,1,fp);

    printf("出版社:");
    scanf("%s",&(*New)->info.publisher);
    fwrite((*New)->info.ISBN,N,1,fp);

    printf("出版時間:");
    scanf("%s",&(*New)->info.time);
    fwrite((*New)->info.ISBN,N,1,fp);

    printf("價格:");
    scanf("%5f",&(*New)->info.price);
    fwrite((*New)->info.ISBN,N,1,fp);
}

/********************************************************
 函數功能:輸出圖書信息
 *******************************************************/
void Print_book(Link *Head)
{
    int i = 0;
    Link p;
    p = *Head;

    printf("/*******************************************\
            \n管理系統所有的圖書為:\n");
    if(p->next == NULL)
    {
        printf("沒有圖書!\n");
    }
    while(p->next != NULL)
    {
        i++;
        print(&p->next);//調用函數輸出指針p所指向的圖書的信息
        p = p->next;
    }
}

/**************************************************
 函數功能:輸出一本圖書的信息
 *************************************************/
void print(Link *L)
{
    Link p;
    p = *L;

    printf("ISBN:%s\n",p->info.ISBN);
    printf("書名:%s\n",p->info.name);
    printf("作者:%s\n",p->info.writer);
    printf("出版社:%s\n",p->info.publisher);
    printf("出版時間:%s\n",p->info.time);
    printf("價格:%f\n",p->info.price);

}
Copyright © Linux教程網 All Rights Reserved