用链表实现部分图书信息管理

#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<stdlib.h>
#define N sizeof(struct book)
#define PT "%-5d %10s %6s %6s %8s %3d 
",p->num,p->name,p->where,p->author,p->pub,p->count
struct book /*图书信息*/
{
    int num; /*书号*/
    char name[10]; /*书名*/
    char where[10]; /*所在书库*/
    char author[15]; /*作者*/
    char pub[20]; /*出版社*/
    int count; /*数量*/
    struct book *next;
};
typedef struct book *L;

void save(L head);

/*输出模块*/
void print(struct book *p0)
{
    struct book *p;
    p=p0->next;
    printf("

		^^^^^^^^^^^^^^图书信息表^^^^^^^^^^^^^^");
    printf("

图书编号---图书名称---所在书库----作者----出版社---数量
");
    while(p)
    {
        printf("%-5d %10s %6s %6s %8s %3d 
",p->num,p->name,p->where,p->author,p->pub,p->count);
        p=p->next;
    }
    getch();
}
/*输入模块*/
struct book *creat()
{
    struct book *head,*p1,*p2;
    int i=0;
    head=p2=(struct book *)malloc(N);
    head->next=NULL;
    printf("

		录入图书信息");
    printf("
	---------------------------------------");
    while(1)
    {
        p1=(struct book *)malloc(N);
        printf("
 请输入图书编号(书号为0结束): ");
        scanf("%d",&p1->num);
        if(p1->num!=0)
        {
            printf("

书名 所在书库 作者 出版社 图书数量
");
            scanf("%s%s%s%s%d",p1->name,p1->where,p1->author,p1->pub,&p1->count);
            p2->next=p1;
            p2=p1;
            i++;
        }
        else
        break;
    }
    p2->next=NULL;
    free(p1);
    printf("
		----------------------------------------");
        printf("
		 %d 种书录入完毕",i);
    getch();
    return head;
}
/*查找模块*/
void find(struct book *p0)
{
    char name[10];
    int flag=1;
    struct book *p;
    p=p0->next;
    printf("请输入要查找的书名:
");
    scanf("%s",name);
    for(p=p0;p;p=p->next)
    if(strcmp(p->name,name)==0)
    {
        printf("

图书编号---图书名称---所在书库----作者----出版社---数量
");
        printf(PT);
        flag=0;
        break;
    }
    if(flag)
        printf("
 暂无此图书信息
");
    getch();
}
/*删除模块*/
void del(struct book *p0)
{
    char name[10];
    int flag=1;
    struct book *p;
    p=p0;
    printf("请输入要删除的书名:
");
    scanf("%s",name);
    while(p!=NULL)
    {
        if(strcmp(p->name,name)==0)
        {
            p0->next=p->next; /*后续节点连接到前驱节点之后*/
            free(p);
            printf("	该书资料已删除.");
            flag=0;
            break;
        }
        p0=p;
        p=p->next;
    }
    save(p0);
    if(flag)
        printf("
	无此图书信息。");
        getch();
}
/*增加模块*/
void insert(L head)
{
    int k,flag;
    L p,pre;
    
    if(pre == NULL)
        pre = head;

    while(1)
    {
        flag = 0;
        printf("
 请输入要增加的图书编号(书号为0 退出): ");
        scanf("%d",&k);
        if(k!=0)
        {
            pre = head->next;
            while(pre) //找到重号
            {
                if(k == pre->num){
                    printf("	该书已存在");
                    system("PAUSE");
                    flag = 1;
                    break;
                }
                pre = pre->next;
            }
            if(flag)
                break;
            p = new book;
            printf("

书名 所在书库 作者 出版社 图书数量
");
            p->num = k;
            scanf("%s%s%s%s%d",p->name,p->where,p->author,p->pub,&p->count);
            p->next = head->next;
            head->next = p;
            printf("	已成功插入.");
        }
        else 
            break;
    }
    save(head);
}
/*修改模块*/
void modify(struct book *p0)
{
    char name[10];
    int flag=1;
    int choice;
    struct book *p;
    p=p0->next;
    printf("请输入要修改的书名:
");
    scanf("%s",name);
    while(p!=NULL&&flag==1)
    {
        if(strcmp(p->name,name)==0)
        {
            printf("
	请选择要修改的项:");
            printf("
	 1.修改图书编号
");
            printf("
	 2.修改图书所在书库
");
            printf("
	 3.修改图书作者
");
            printf("
	 4.修改图书出版社
");
            printf("
	 5.修改图书库存量
");
            scanf("%d",&choice);
            switch(choice)
            {
                case 1:
                {
                    printf("
 请输入新的图书编号:");
                    scanf("%d",&p->num); break;
                }
                case 2:
                {
                    printf("
 请输入新的图书书库:");
                    scanf("%s",p->where); break;
                }
                case 3:
                {
                    printf("
 请输入新的图书作者:");
                    scanf("%s",p->author); break;
                }
                case 4:
                {
                    printf("
 请输入新的图书出版社:");
                    scanf("%s",p->pub); break;
                }
                case 5:
                {
                    printf("
 请输入新的图书库存量:");
                    scanf("%d",&p->count); break;
                }
            }
            printf("
	该项已成功修改。
	 新的图书信息:");
            printf("

图书编号---图书名称---所在书库----作者----出版社---数量
");
            printf(PT);
            flag=0;
            save(p0);
        }
        p = p->next;
    }
    if(flag) printf("
	暂无此图书信息。");
    getch();
}
/*读文件*/
struct book *read_file()
{
    int i=0;
    L p,p1,head=NULL;
    FILE *fp;
    if((fp=fopen("library.txt","r"))==NULL)
    {
        printf("




 	********库文件不存在,请创建!**********");
        getch();
        return NULL;
    }
    head=new book;
    head->next=NULL;
    printf("
 已有图书信息:");
    printf("

图书编号---图书名称---所在书库----作者----出版社---数量
");
    p=new book; /*开辟空间以存放的取得信息*/
    p1 = head;
    while(fscanf(fp,"%d%s%s%s%s%d",&p->num,p->name,p->where,p->author,p->pub,&p->count)!=EOF)
    {
        printf("%d %s %s %s %s %d
",p->num,p->name,p->where,p->author,p->pub,p->count);
        i++;
        p1->next = p;
        p1 = p;
        p=new book;
    }
    p1->next = NULL;
    delete p;
    fclose(fp);
    printf("
 共种%d 图书信息",i);
    printf("


 文件中的信息以正确读出。按任意键进入主菜单。");
    getch();
    return (head);
}
/*保存文件*/
void save(L head)
{
    FILE *fp;
    L p;
    fp=fopen("library.txt","w"); /*以只写方式打开二进制文件*/
    if(fp==NULL) /*打开文件失败*/
    {
        printf("
=====>打开文件失败!
");
        getch();
        return ;
    }
    else{
        for(p=head->next;p!=NULL;p=p->next)
            fprintf(fp,"%d %s %s %s %s %d
",p->num,p->name,p->where,p->author,p->pub,p->count);
    }
    fclose(fp);
}
void Begin()
{
    L head=new book, p;
    int choice=1;
    head->next = NULL;
    p=read_file();
    if(p)
        head = p;
    do
    {
        system("cls");
        printf("		----------Welcome---------
");
        printf("

	欢迎您,图书管理员.

");
        printf("
	 请选择:");
        printf("
	 1.查询图书信息
");
        printf("
	 2.修改图书信息
");
        printf("
	 3.增加图书信息
");
        printf("
	 4.删除图书信息
");
        printf("
	 5.显示所有图书信息
");
        printf("
	 0.退出系统
");
        scanf("%d",&choice);
        switch(choice)
        {
            case 1: find(head); break;
            case 2: modify(head); break;
            case 3: insert(head); break;//已改完
            case 4: del(head); break;
            case 5: print(head); break;
            case 0: system("cls");
            printf("




	^^^^^^^^^^谢谢使用,再见^^^^^^^^^^!

");
            system("PAUSE");
            exit(0);
            default :
                printf("

		输入有误!!
");
                system("PAUSE");system("cls"); break;
        }
    }while(choice!=0);
    save(head);
}
void About()
{
    system("cls");
    printf("


");
    printf("		          开发人员           

");
    printf("		****************************

");
    printf("		*****      XXXXXX      *****

");
    printf("		*****      XXXXXX      *****

");
    printf("		*****      XXXXXX      *****

");
    printf("		****************************

");
    getch();
}
void Introduction()
{
    system("cls");
    printf("


");
    printf("		          系统介绍           

");
    printf("		*****************************

");
    printf("		    本系统主要实现图书信息   

");
    printf("		 查找 增加 删除 修改 浏览功能 

");
    printf("		*****************************

");
    getch();
}
void Welcome()
{
    while(1)
    {
        int input;
        system("cls");
        printf("


		图书馆管理系统
");
        printf("
		1.管理系统
");
        printf("
		2.开发人员
");
        printf("
		3.系统简介
");
        printf("
		4.退出
");
        printf("
	请输入你的选项:");
        scanf("%1d", &input);
        switch(input){
            case 1:
                system("cls"); Begin(); break;
            case 2:
                About(); break;
            case 3:
                Introduction(); break;
            case 4:
                exit(0);
            default :
                printf("

		输入有误!!
");
                system("PAUSE"); system("cls"); break;
        }    
    }
}

int main()
{
    system("mode con  cols=70 lines=30");
    Welcome();
    return 0;
}
原文地址:https://www.cnblogs.com/didideblog/p/7059915.html