当前位置:   article > 正文

【零基础学数据结构】顺序表实现书籍存储

【零基础学数据结构】顺序表实现书籍存储

目录

书籍存储的实现规划

​编辑 前置准备:

 书籍结构体:

书籍展示的初始化和文件加载

书籍展示的销毁和文件保存

 书籍展示的容量检查

 书籍展示的尾插实现

 书籍展示的书籍增加

 书籍展示的书籍打印

 书籍删除展示数据

书籍展示修改数据

在指定位置之前删除数据

 书籍查找展示数据

 测试文件:

 源代码文件:


书籍存储的实现规划

 前置准备:

文件前置创建:

  1. BookList.h  -  头文件声明
  2. BookList.c  -  实现功能
  3. text.c           -  测试文件
  • 创建书籍结构体
  • 创建动态内存

  BookList 结构体的创建
 为了方便后续更改,我们有以下定义
 1.书名  2.作者  3.价格  4.分类  5.编号

  1. #define BOOKNAME 100
  2. #define AUTHOR 50
  3. #define TYPE 30
  4. #define ID 50

 书籍结构体:

  1. typedef struct BookList
  2. {
  3. char book_name[BOOKNAME]; //书名
  4. char author[AUTHOR]; //作者
  5. float price; //价格
  6. char type[TYPE]; //分类
  7. char id[ID]; //编号
  8. }BookList;

 定义类型方便更改

typedef BookList SLDataType;

创建动态顺序表 

  1. typedef struct Book
  2. {
  3. SLDataType* arr; //指针变量,指向结构体类型元素的数组
  4. int size; //有效数据的个数
  5. int capacity; //空间容量大小
  6. }Book;

书籍展示的初始化和文件加载

  1. void BookInit(Book* book);
  2. void LoadBook(Book* book);
  1. // 书籍展示的初始化和文件加载
  2. void BookInit(Book* book)
  3. {
  4. book->arr = NULL;
  5. book->size = book->capacity = 0;
  6. LoadBook(book);
  7. }
  8. void LoadBook(Book* book)
  9. {
  10. FILE* pf = fopen("booklist", "rb");
  11. if (NULL == pf)
  12. {
  13. perror("fopen booklist error!");
  14. return;
  15. }
  16. //加载文件
  17. BookList b2;
  18. while (fread(&b2, sizeof(BookList), 1, pf))
  19. {
  20. //尾插
  21. BookPushBack(book, b2);
  22. }
  23. printf("数据加载成功!\n");
  24. fclose(pf);
  25. pf = NULL;
  26. }

书籍展示的销毁和文件保存

  1. void BookDestroy(Book* book);
  2. void SaveBook(Book* book);
  1. // 书籍展示的销毁和文件保存
  2. void SLDestroy(Book* ps)
  3. {
  4. if (ps->arr==NULL) //判断ps->arr是否为NULL,如果不为NULL,说明空间需要释放
  5. {
  6. free(ps->arr);
  7. }
  8. ps->arr = NULL;
  9. ps->size = ps->capacity = 0;
  10. }
  11. void BookDestroy(Book* book)
  12. {
  13. SaveBook(book);
  14. SLDestroy(book);
  15. }
  16. // 图书书籍存储
  17. void SaveBook(Book* book)
  18. {
  19. FILE* pd = fopen("booklist", "wb");
  20. if (NULL == pd)
  21. {
  22. perror("fopen booklist error!");
  23. return;
  24. }
  25. // 存储书籍数据
  26. for (int i = 0; i < book->size; i++)
  27. {
  28. fwrite(book->arr+i, sizeof(BookList), 1, pd);
  29. }
  30. printf("数据保存成功!\n");
  31. fclose(pd);
  32. pd = NULL;
  33. }

 书籍展示的容量检查

void BookCheckCapacity(Book* book);
  1. // 书籍展示的容量检查
  2. void BookCheckCapacity(Book* book)
  3. {
  4. if (book->capacity == book->size)
  5. {
  6. int newcapacity = book->capacity == 0 ? 4 : book->capacity * 2;
  7. //动态内存分配
  8. SLDataType* tmp = (SLDataType*)realloc(book->arr, newcapacity * sizeof(SLDataType));
  9. if (NULL == tmp)
  10. {
  11. perror("realloc error!");
  12. return;
  13. }
  14. book->arr = tmp;
  15. book->capacity = newcapacity;
  16. }
  17. }

 书籍展示的尾插实现

void BookPushBack(Book* book, SLDataType x);
  1. // 书籍展示的尾插实现
  2. void BookPushBack(Book* book, SLDataType x)
  3. {
  4. assert(book);
  5. //尾插之前检查内存是否够
  6. BookCheckCapacity(book);
  7. //进行尾插
  8. book->arr[book->size++] = x;
  9. }

 书籍展示的书籍增加

void BookAdd(Book* book);
  1. // 书籍展示的书籍增加
  2. void BookAdd(Book* book)
  3. {
  4. // 1.书名 2.作者 3.价格 4.分类 5.编号
  5. BookList b1;
  6. printf("请输入你要添加的书籍名字:\n");
  7. scanf("%s", b1.book_name);
  8. printf("请输入你要添加的书籍作者:\n");
  9. scanf("%s", b1.author);
  10. printf("请输入你要添加的书籍价格:\n");
  11. scanf("%f", &(b1.price));
  12. printf("请输入你要添加的书籍分类:\n");
  13. scanf("%s", b1.type);
  14. printf("请输入你要添加的书籍编号:\n");
  15. scanf("%s", b1.id);
  16. // 添加数据
  17. BookPushBack(book, b1);
  18. printf("添加成功!\n");
  19. }

 书籍展示的书籍打印

void BookPint(Book* book);
  1. // 书籍展示的书籍打印
  2. void BookPint(Book* book)
  3. {
  4. // 1.书名 2.作者 3.价格 4.分类 5.编号
  5. printf("%-10s %-10s %-10s %-10s %-15s\n", "书名", "作者", "价格", "分类", "编号");
  6. printf("-------------------------------------------------------------\n");
  7. for (int i = 0; i < book->size; i++)
  8. {
  9. printf("%-10s %-10s %-10.1f %-10s %-15s\n",
  10. book->arr[i].book_name,
  11. book->arr[i].author,
  12. book->arr[i].price,
  13. book->arr[i].type,
  14. book->arr[i].id
  15. );
  16. }
  17. }

 书籍删除展示数据

void BookDel(Book* book);
  1. //删除书籍展示数据
  2. void BookDel(Book* book)
  3. {
  4. // 在删除之前先检查数据存不存在
  5. char name[BOOKNAME];
  6. printf("请输入您需要删除的书籍:\n");
  7. scanf("%s", name);
  8. int find = FindByName(book, name);
  9. if (find < 0)
  10. {
  11. printf("无法找到需要删除的图书\n");
  12. return;
  13. }
  14. SLErase(book, find);
  15. printf("删除成功!\n");
  16. }

书籍展示修改数据

void BookModify(Book* book);
  1. //书籍展示修改数据
  2. void BookModify(Book* book)
  3. {
  4. //要修改的书籍需要存在
  5. char name[BOOKNAME];
  6. printf("请输入你需要修改的图书名字:\n");
  7. scanf("%s", name);
  8. //查找书籍看是否存在
  9. int find = FindByName(book, name);
  10. if (find < 0)
  11. {
  12. printf("无法找到需要修改的图书\n");
  13. return;
  14. }
  15. //直接修改
  16. printf("请输入新的图书名字:\n");
  17. scanf("%s", book->arr[find].book_name);
  18. printf("请输入新的图书作者:\n");
  19. scanf("%s", book->arr[find].author);
  20. printf("请输入新的图书价格:\n");
  21. scanf("%f", &(book->arr[find].price));
  22. printf("请输入新的图书分类:\n");
  23. scanf("%s", book->arr[find].type);
  24. printf("请输入新的图书编号:\n");
  25. scanf("%s", book->arr[find].id);
  26. printf("修改成功!\n");
  27. }

在指定位置之前删除数据

void SLErase(Book* book, int pos);
  1. //在指定位置之前删除数据
  2. void SLErase(Book* book, int pos)
  3. {
  4. assert(book);//断言防止传入空指针
  5. //判断删除的数据是否合法
  6. if (pos >= 0 && pos < book->size)
  7. {
  8. // 删除数据
  9. for (int i = pos; i < book->size - 1; i++)
  10. {
  11. book->arr[i] = book->arr[i + 1];//ps->[size-2]=ps->arr[size-1]
  12. }
  13. --book->size;
  14. }
  15. }

 书籍查找展示数据

void BookFind(Book* book);
  1. //查找图书数据
  2. void BookFind(Book* book)
  3. {
  4. char name[BOOKNAME];
  5. printf("请输入你要查找的书籍名字:\n");
  6. scanf("%s", name);
  7. //检查图书数据是否存在
  8. int find = FindByName(book, name);
  9. if (find < 0)
  10. {
  11. printf("您要查找的书籍不存在!\n");
  12. return;
  13. }
  14. // 1.书名 2.作者 3.价格 4.分类 5.编号
  15. printf("%-10s %-10s %-10s %-10s %-15s\n", "书名", "作者", "价格", "分类", "编号");
  16. printf("-------------------------------------------------------------\n");
  17. //找到了
  18. printf("%-10s %-10s %-10.1f %-10s %-15s\n",
  19. book->arr[find].book_name,
  20. book->arr[find].author,
  21. book->arr[find].price,
  22. book->arr[find].type,
  23. book->arr[find].id
  24. );
  25. }

 测试文件:

  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. #include "BookList.h"
  3. #include <windows.h>
  4. enum book_name
  5. {
  6. ExitBook, // 0
  7. AddBook, // 1
  8. DelBook, //...
  9. PrintBook,
  10. ChangeBook,
  11. CheckBook
  12. };
  13. void book_print()
  14. {
  15. printf("*****************书籍录*********************\n");
  16. printf("*************1. 增添图书********************\n");
  17. printf("*************2. 删除图书********************\n");
  18. printf("*************3. 打印图书********************\n");
  19. printf("*************4. 修改图书********************\n");
  20. printf("*************5. 查找图书********************\n");
  21. printf("*************0. 退出图书录******************\n");
  22. }
  23. int main()
  24. {
  25. Book b1;// 创建通讯录对象,实际上就是顺序表对象,等价于 SL sl
  26. //顺序表的创建
  27. BookInit(&b1);
  28. int op = -1;
  29. do
  30. {
  31. book_print();
  32. printf("请选择你的操作:\n");
  33. scanf("%d", &op);
  34. switch (op)
  35. {
  36. case ExitBook:
  37. printf("退出图书录系统...\n");
  38. Sleep(1000);
  39. break;
  40. case AddBook:
  41. BookAdd(&b1);
  42. Sleep(1000);
  43. break;
  44. case DelBook:
  45. BookDel(&b1);
  46. Sleep(1000);
  47. break;
  48. case PrintBook:
  49. BookPint(&b1);
  50. Sleep(1000);
  51. break;
  52. case ChangeBook:
  53. BookModify(&b1);
  54. Sleep(1000);
  55. break;
  56. case CheckBook:
  57. BookFind(&b1);
  58. Sleep(1000);
  59. break;
  60. default:
  61. printf("选择错误,请重新选择\n");
  62. Sleep(1000);
  63. break;
  64. }
  65. } while (op != 0);
  66. // 顺序表的销毁
  67. BookDestroy(&b1);
  68. return 0;
  69. }

 源代码文件:

BookList_2024_4_5 · 34c38d2 · 阳区欠/C语言学习路程 - Gitee.com

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/415721?site
推荐阅读
相关标签
  

闽ICP备14008679号