图书管理系统

问题描述:创建一个图书馆管理系统,可进行还书(插入),排序,查找,借书(删除)操作。

基本要求:

①所有信息存储在一个带头结点的单向链表中,每个结点存储一条图书记录,即结构体(book),其中各域为:书号(number)、书名(title)、作者(writer)、定价(pricing)、出版社(publishinghouse),指针域(next)。
②系统初始时图书记录为空,由用户录入信息,进行插入(包括创建),排序,查找,删除操作。
③有两种排序算法可选:选择排序和直接插入排序,均由链表实现。
④如输入有错,给出出错提示。

#include<stdio.h>
#include<stdlib.h>
typedef struct Book
{
    long num;
    char name[30];
    char writer[10];
    float price;
    char out[50];
    struct Book *next;
} know,*link;
link Input()
{
    int n;
    link head;
    link p1,p2;
    n=0;
    p1=p2=(link) malloc(sizeof(know));
    printf("请输入图书编号,名称,作者,价格,出版社,并以图书编号0结束\n");
    scanf("%d",&p1->num);
    while(p1->num)
    {
        scanf("%s%s%f%s",&p1->name,&p1->writer,&p1->price,&p1->out);
        n++;
        if(n==1)head=p1;
        else p2->next=p1;
        p2=p1;
        p1=(link) malloc(sizeof(know));
        scanf("%d",&p1->num);
    }
    p2->next=NULL;
    printf("输入数据成功!\n");
    return(head);
}
link Output(link head)
{
    if(head==NULL)
    {
        printf("数据库中无图书信息!\n");
        return head;
    }
    else
    {
        link p1,p2;
        p1=head;
        do
        {
            printf("%d %s %s %.1f %s",p1->num,p1->name,p1->writer,p1->price,p1->out);
            p1=p1->next;
            printf("\n");
        }
        while(p1);
    }
}
link Sort1(link head)//直接插入排序
{
    int i,x=1;
    link p1,p2,p3;//p1记录未排序的数,p2记录已经排好序的数,p3记录p1前面的指针;
       if(head==NULL||head->next==NULL)
    {
        printf("数据库中无图书信息或只有一本书!\n");
        return head;
    }
    else
    {
        p1=head->next;
        p3=head;
        while(p1)
        {
            p2=head;
            for(i=0; i<x; i++)
            {
                if((p1->num)>(p2->num)&&(p1->num)<(p2->next->num))//找到合适的位置插入
                {
                    p3->next=p1->next;
                    p1->next=p2->next;
                    p2->next=p1;
                    break;
                }
                else if((p1->num)<(p2->num))
                {
                    p3->next=p1->next;
                    p1->next=head;
                    head=p1;
                    break;
                }
                else if((p1->num)>(p2->num)&&i==(x-1))
                {
                    p3=p3->next;
                }
                p2=p2->next;
            }
            x++;
            p1=p3->next;
        }
        Output(head);
        return head;
    }
}
link Sort2(link head)//选择排序
{
    link p1,min,p3,front,p2,p4,p5;//min,front,p3用来建立新的链表,p1表示旧链表剩余的数p2记录p1前面的地址,p4和p5用于代替p1和p2;
    p3=min=(link) malloc(sizeof(know));
    int ok=0;
    if(head==NULL||head->next==NULL)
    {
        printf("数据库中无图书信息或只有一本书!\n");
        return head;
    }
    else
    {
        while(head->next)
        {
            p2=head;
            p1=head->next;
            *min=*head;
            ok++;
            while(p1)
            {
                if(min->num>p1->num)
                {
                    *min=*p1;
                    p4=p2;
                    p5=p1;
                }
                p2=p1;
                p1=p1->next;
            }
            if(min->num!=head->num)
            {
                p4->next=p5->next;
                free(p5);
            }
            else
            {
                p5=head;
                head=head->next;
                free(p5);
            }
            if(ok==1)
            {
                front=min;
            }
            else
            {
                p3->next=min;
            }
            p3=min;
            min=(link) malloc(sizeof(know));
        }
        p3->next=head;
        Output(front);
        return front;
    }

}
link Back(link head)
{
    link book,p1,p2;
    printf("请输入还回图书的编号,名称,作者,价格,出版社,并以0结束输入\n");
    while(1)
    {
        p1=head;
        book=(link) malloc(sizeof(know));
        scanf("%d",&book->num);
        if(book->num==0)break;
        else
        {
            scanf("%s%s%f%s",&book->name,&book->writer,&book->price,&book->out);
            if(head==NULL)
            {
                head=book;
                book->next=NULL;
            }
            else
            {
                while((p1)&&(book->num>p1->num))
                {
                    p2=p1;
                    p1=p1->next;
                }
                if(p1==NULL)
                {
                    p2->next=book;
                    book->next=NULL;
                }
                else if(head==p1)
                {
                    book->next=head;
                    head=book;
                }
                else
                {
                    p2->next=book;
                    book->next=p1;
                }
            }
        }
    }
    printf("插入成功!\n");
    printf("库存图书还有:\n");
    Output(head);
    return head;
}
link Find(link head)//查找书籍
{
    link book,p1;
    book=(link)malloc(sizeof(know));
    if(head==NULL)
    {
        printf("数据库中无图书信息!\n");
        return;
    }
    while(1)
    {
        p1=head;
        printf("请输入要查找图书的编号,并以0结束查找!\n");
        scanf("%d",&book->num);
        if(book->num==0)break;
        else
        {
            while((p1)&&(book->num!=p1->num))
            {
                p1=p1->next;
            }
            if(p1==NULL)
            {
                printf("对不起,本书已借出!\n");
            }
            else
            {
                printf("%d %s %s %.1f %s\n",p1->num,p1->name,p1->writer,p1->price,p1->out);
            }
        }
    }
}
link Borrow(link head)
{
    link book,p1,p2;
    book=(link)malloc(sizeof(know));
    printf("库存图书还有:\n");
        Output(head);
    while(1)
    {
        p1=head;
        printf("请输入要借图书的编号,并以0结束输入!\n");
        scanf("%d",&book->num);
        if(book->num==0)break;
        else
        {
            if(head==NULL)
            {
                printf("数据库中无图书信息!\n");
            }
            else
            {
                while((p1)&&(book->num!=p1->num))
                {
                    p2=p1;
                    p1=p1->next;
                }
                if(p1==NULL)
                {
                    printf("对不起,本书已借出!\n");
                    return;
                }
                else if(head==p1)head=p1->next;
                else
                {
                    p2->next=p1->next;
                }
            }
            printf("借书成功!\n");
            printf("库存图书还有:\n");
            Output(head);
        }
    }
    return head;
}
int main()
{
    int s;
    link head=NULL;
    while(1)
    {
        printf("1 录入数据\n");
        printf("2 还书\n");
        printf("3 排序(按书号)\n");
        printf("4 查找(按书号)\n");
        printf("5 借书\n");
        printf("6 输出数据\n");
        printf("0 退出\n");
        printf("请选择要使用的服务编号:\n");
        scanf("%d",&s);
        if(s==0)break;
        switch(s)
        {
        case 1:
            head=Input();
            break;
        case 2:
            head=Back(head);
            break;
        case 3:
                printf("请选择排序方法:1 直接插入排序 2 选择排序\n");
                scanf("%d",&s);
                if(s==1)head=Sort1(head);
                else if(s==2)head=Sort2(head);
                else printf("您输入的编号不合法\n");
            break;
        case 4:
            Find(head);
            break;
        case 5:
            if(head==NULL)printf("对不起,图书已经全部借出!\n");
            else head=Borrow(head);
            break;
        case 6:
            Output(head);
            break;
        default:
            printf("您输入的编号不合法!\n");
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值