签到

06月20日
尚未签到

共有回帖数 0

    回望空城

    等级:
    #include stdio.h
    #include stdlib.h
    #include string.h
    #include conio.h

    typedef struct bookinfo book;
    /****** 图书信息结构体 *******/
    struct bookinfo
    {
    int id; /* 登录号 */
    char name[32]; /* 书名 */
    char author[12]; /* 作者名 */
    int class_id; /* 分类号 */
    char unit[256]; /* 出版单位 */
    int time[3]; /* 出版时间 */
    float price; /* 价格 */

    struct bookinfo *next; /* 下个图书的信息 */
    };
    /*****************************/


    /* 功能:录入图书信息 */
    void input(book **head)
    {
    book *s, *p;

    if(*head == NULL) {/* 如果表头为空,先为它分配内存 */
    *head = (book *)calloc(1, sizeof(book));
    p = *head;
    } else {/* 否则,就说明有内容,直接切换到尾结点 */
    p = *head;
    while(p-next)
    p = p-next;
    }

    /* 为这个结点分配内存 */
    s = (book *)calloc(1, sizeof(book));
    printf("登录号:");
    scanf("%d", &s-id);

    printf("书名:");
    scanf("%s", s-name);

    printf("作者名:");
    scanf("%s", s-author);

    printf("分类号:");
    scanf("%d", &s-class_id);

    printf("出版单位:");
    scanf("%s", s-unit);

    printf("出版时间[年 月 日]:");
    scanf("%d %d %d", &s-time[0], &s-time[1], &s-time[2]);

    printf("价格:");
    scanf("%f", &s-price);

    p-next = s; /* 保存这个结点 */
    p = p-next; /* 切换至下个结点 */
    p-next = NULL;

    printf("已经成功录入!n");
    }


    int output(book *head)
    {
    book *p;
    p = head-next;
    if(head == NULL || head-next == NULL)
    {
    printf("tt未记录图书信息!n");
    return -1;
    }
    system("cls");/* 清空屏幕内容 */
    /* 打印表头 */
    printf(
    "┌———┬——————┬————┬———┬———————┬—————┬———┐n"
    "│%s│ %s │ %s │%s│ %s │ %s │ %s │n"
    "├———┼——————┼————┼———┼———————┼—————┼———┤n"
    ,"登录号","书名","作者名","分类号","出版单位","出版时间","价格");
    /* 打印表中间的内容 */
    do {
    printf( "│%6d│%12s│%8s│%6d│%14s│%04d-%02d-%02d│%6.1f│n",
    p-id, p-name, p-author, p-class_id, p-unit,
    p-time[0],p-time[1],p-time[2], p-price
    );
    p = p-next;/* 切换至下个结点 */
    } while(p != NULL);
    /* 打印表尾 */
    printf( "└———┴——————┴————┴———┴———————┴—————┴———┘n");
    return 0;
    }


    /* 功能:保存链表中的图书信息数据至文件 */
    int save_data(book *head)
    {
    book *p;
    FILE *fp;
    /* 以只“写”的方式打开book.data二进制文件 */
    fp = fopen("book.data", "wb");
    /* 如果文件打开失败,就返回-1 */
    if(NULL == fp) {
    return -1;
    }
    p = head-next;
    do {
    /*
    * 把这个结点的数据全部写入至文件内
    * 由于next指针不需要写入至文件,因此,数据大小就是:
    * sizeof(book)-sizeof(book*)
    * 总数据大小减去指针的大小
    */
    fwrite(p, sizeof(book), 1, fp);
    p = p-next;/* 切换至下个结点 */
    } while(p != NULL);

    fclose(fp);/* 关闭文件 */
    return 0;
    }


    /* 功能:从文件读取图书信息数据 */
    int read_data(book **head)
    {
    int n;
    book *s, *p;
    FILE *fp;
    /* 以只“读”的方式打开book.data二进制文件 */
    fp = fopen("book.data", "rb");
    /* 如果文件打开失败,就返回-1 */
    if(NULL == fp) {
    *head = NULL;
    return -1;
    }

    *head = (book *)calloc(1, sizeof(book));
    p = *head;

    while(!feof(fp)) {
    /* 为下个结点分配内存空间 */
    s = (book *)calloc(1, sizeof(book));
    /* 从文件内读取数据保存至结点 */
    n = fread(s, sizeof(book), 1, fp);
    if(n  1) {
    free(s);
    p-next= NULL; /* 最后一个结点为NULL */
    break;
    }

    p-next = s; /* 保存下个结点 */
    p = p-next; /* 切换至下个结点 */
    p-next= NULL; /* 最后一个结点为NULL */
    }

    fclose(fp);/* 关闭文件 */
    return 0;
    }

    /* 功能:删除指定登录号的图书的信息 */
    int delete(book *head)
    {
    char name[256];
    int choice, id;
    int found = 0;
    book *p, *t;

    /* 如果表头为空 */
    if(head == NULL || head-next == NULL) {
    printf("没有记录学生信息!n");
    return -1;
    }
    printf(
    "要删除图书信息,请选择删除方式:n"
    "[1]通过书名来删除n"
    "[2]通过登录号来删除n"
    "选择:"
    );
    while(1) {
    scanf("%d", &choice);
    if(choice  0 && choice  3) {
    break;
    }

    printf("选择错误,请重新选择:");
    }
    /* 接受用户输入的内容 */
    if(choice == 1) {
    printf("请输入书名:");
    scanf("%s", name);
    } else if(choice == 2) {
    printf("请输入登录号:");
    scanf("%d", &id);
    }

    p = head;

    while(p-next) {
    t = p;
    p = p-next;
    /* 根据用户输入的内容以及选择的方式,来查找匹配数据 */
    if( choice == 1 && strcmp(p-name, name) == 0
    || choice == 2 && p-id == id) {
    found = 1;
    break;
    }
    }
    /* 如果没有找到 */
    if( found != 1 ) {
    printf("没有找到需删除信息的学生!n");
    return -1;
    }
    /* 打印表头 */
    printf(
    "┌———┬——————┬————┬———┬———————┬—————┬———┐n"
    "│%s│ %s │ %s │%s│ %s │ %s │ %s │n"
    "├———┼——————┼————┼———┼———————┼—————┼———┤n"
    ,"登录号","书名","作者名","分类号","出版单位","出版时间","价格");
    /* 打印中间内容 */
    printf( "│%6d│%12s│%8s│%6d│%14s│%04d-%02d-%02d│%6.1f│n",
    p-id, p-name, p-author, p-class_id, p-unit,
    p-time[0],p-time[1],p-time[2], p-price
    );
    /* 打印表尾 */
    printf( "└———┴——————┴————┴———┴———————┴—————┴———┘n");

    while(1) {
    printf("真的需要删除?[1:是 2:否]:");
    scanf("%d", &choice);
    if(choice == 1) {
    t-next = p-next;
    free(p); /* 释放这个结点占用的内存 */
    printf("已经删除!n");
    break;
    } else if(choice == 2) {
    printf("任意键继续......");
    }
    }
    return 0;
    }


    /* 功能:查询图书信息 */
    int find(book *head)
    {
    char author[256], name[256];
    int choice;
    int found = 0;
    book *p, *t;

    if(head == NULL || head-next == NULL) {
    printf("没有记录学生信息!n");
    return -1;
    }
    printf(
    "要查询图书信息,请选择查询方式:n"
    "[1]通过书名来查询n"
    "[2]通过作者名来查询n"
    "选择:"
    );
    while(1) {
    scanf("%d", &choice);
    if(choice  0 && choice  3) {
    break;
    }
    printf("选择错误,请重新选择:");
    }
    /* 接受用户输入的内容 */
    if(choice == 1) {
    printf("请输入书名:");
    scanf("%s", name);
    } else if(choice == 2) {
    printf("请输入作者名:");
    scanf("%s", author);
    }

    p = head;
    printf("查询结果:n");

    /* 打印表头 */
    printf(
    "┌———┬——————┬————┬———┬———————┬—————┬———┐n"
    "│%s│ %s │ %s │%s│ %s │ %s │ %s │n"
    "├———┼——————┼————┼———┼———————┼—————┼———┤n"
    ,"登录号","书名","作者名","分类号","出版单位","出版时间","价格");

    while(p-next) {
    t = p;
    p = p-next;
    /* 根据用户输入的内容以及选择的方式,来查找匹配数据 */
    if( choice == 1 && strcmp(p-name, name) == 0
    || choice == 2 && strcmp(p-author, author) == 0) {
    found = 1;
    /* 打印中间内容 */
    printf(
    "│%6d│%12s│%8s│%6d│%14s│%04d-%02d-%02d│%6.1f│n",
    p-id, p-name, p-author, p-class_id, p-unit,
    p-time[0],p-time[1],p-time[2], p-price
    );
    }
    }
    /* 打印表尾 */
    printf( "└———┴——————┴————┴———┴———————┴—————┴———┘n");
    /* 如果没有找到 */
    if(found != 1) {
    printf("没有找到符合要求的学生信息!n");
    return -1;
    }
    return 0;
    }

    /* 功能:修改图书信息 */
    int modify(book *head)
    {
    char name[256];
    int choice, id;
    int found = 0;
    book *p;

    if(head == NULL || head-next == NULL) {
    printf("没有记录学生信息!n");
    return -1;
    }
    printf(
    "要修改图书信息,请选择修改方式:n"
    "[1]通过书名来修改n"
    "[2]通过登录号来修改n"
    "选择:"
    );
    while(1) {
    scanf("%d", &choice);

    if(choice  0 && choice  3) {
    break;
    }
    printf("选择错误,请重新选择:");
    }
    /* 接受用户输入的内容 */
    if(choice == 1) {
    printf("请输入书名:");
    scanf("%s", name);
    } else if(choice == 2) {
    printf("请输入登录号:");
    scanf("%d", &id);
    }

    p = head;

    while(p-next) {
    p = p-next;
    /* 根据用户输入的内容以及选择的方式,来查找匹配数据 */
    if( choice == 1 && strcmp(p-name, name) == 0
    || choice == 2 && p-id == id) {
    found = 1;
    break;
    }
    }

    if(found != 1) {
    printf("没有找到符合要求的图书信息!n");
    return -1;
    }
    printf("登录号:");
    scanf("%d", &p-id);

    printf("书名:");
    scanf("%s", p-name);

    printf("作者名:");
    scanf("%s", p-author);

    printf("分类号:");
    scanf("%d", &p-class_id);

    printf("出版单位:");
    scanf("%s", p-unit);

    printf("出版时间[年 月 日]:");
    scanf("%d %d %d", &p-time[0], &p-time[1], &p-time[2]);

    printf("价格:");
    scanf("%f", &p-price);
    printf("已经修改!");
    return 0;
    }


    int main(void)
    {
    int choice;
    book *head = NULL;
    read_data(&head);/* 读取数据 */
    while(1) {
    system("cls");/* 清空屏幕内容 */

    printf(
    "*********************************nn"
    "*t图书信息管理系统t*n"
    "*tttt*n"
    "*t1 --- 录入图书信息t*n"
    "*t2 --- 查询图书信息t*n"
    "*t3 --- 删除图书信息t*n"
    "*t4 --- 修改图书信息t*n"
    "*t5 --- 输出全部图书信息t*n"
    "*t0 --- 退出并保存数据t*n"
    "*********************************nn"
    "请输入选项0-5:"
    );
    scanf("%d", &choice);
    if(choice == 0) {
    break;
    }
    switch(choice) {
    case 1 : input(&head); getch();break;
    case 2 : find(head); getch();break;
    case 3 : delete(head); getch();break;
    case 4 : modify(head); getch();break;
    case 5 : output(head); getch();break;
    }
    }
    save_data(head);
    return 0;
    }

    楼主 2015-06-24 00:10 回复

共有回帖数 0
  • 回 帖
  • 表情 图片 视频
  • 发表

登录直线网账号

Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号 意见反馈 | 关于直线 | 版权声明 | 会员须知