diff --git a/README.md b/README.md index 094f521..ce5c841 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,49 @@ -# a +# 零件库存管理系统 + +2023/5/21 + +杨腾泽,孙英皓,刘彩月,李聪颖 + +## 项目简介 + +本系统是程序设计与问题求解课程设计项目,实现了库存零件 CSV 格式数据文件的读取和保存,以及数据的增删改查(CRUD)、排序和图表显示等功能。项目采用 C 语言编程实现,在 VS Code 集成开发环境(IDE)中用 GCC 进行编译。系统采用模块化设计,程序结构清晰,采用菜单驱动的命令行界面,操作便捷,能够用 CSV 格式读取和保存数据,通用性强,能够用图表展示数据,直观清楚。 + +下载地址:https://gitee.com/sjandsy/parts-management.git + +项目开发过程中采用 Kanban(看板)进行任务管理和分工协作,并使用 Git 对程序代码和文档进行版本管理。任务分工情况如下: + +| 任务 | 设计 | 开发 | 测试 | 文档 | +| ---- | ---- | ---- | ---- | ---- | +| C1-C3 菜单驱动的用户界面 | | | | | +|C4 添加库存记录 | | | | | +|C5 查询库存记录 | | | | | +|C6 打印库存列表 | | | | | +|C7 修改库存记录 | | | | | +|C8 删除库存记录 | | | | | +|C9 库存记录排序 | | | | | +|C10 读取库存文件 | | | | | +|C11 将库存保存到文件 | | | | | + +每个成员的工作量(百分比): +| | | | | +|--------|-------|---------|-------| +| | | | | + + +## 关于零件库存管理系统 + +设计一个库存零件管理系统,要求采用命令行菜单界面进行交互,具备读取、保存、打印、查询、修改、插入、删除和排序等基本功能,能够以表格和图表形式展示数据,采用 CSV 格式保存数据。 + +系统的功能性需求: +- 数据的读取、保存、打印、查询、修改、插入、删除、排序和图表展示。 + +系统的非功能性需求: +- 菜单驱动的命令行交互界面。 + + +## 需求分析 + +分析系统的功能需求和界面需求,编制用户手册如下。 #### C1: 启动程序 @@ -78,3 +123,173 @@ 商品的名称:电脑 商品的数量:20 ``` + + +#### C7: 修改库存记录 + +选择菜单命令 `6`,根据提示输入零件编号,若零件存在,则继续输入新的零件名和库存数量,并修改库存记录;否则,提示零件不存在并结束。 + +``` +请输入想要操作的选项*-*:6 +请输入需要修改的商品id:101 +原商品的数量:20 +请输入修改的商品数量:12 +商品数量修改成功 *_* + +1 读取 | 2 保存 | 3 打印 | 4 查询 | 5 添加 +6 修改 | 7 删除 | 8 排序 | 9 图表 | 0 退出 + +请输入想要操作的选项*-*:3 +商品的id:101 +商品的名称:电脑 +商品的数量:12 + +1 读取 | 2 保存 | 3 打印 | 4 查询 | 5 添加 +6 修改 | 7 删除 | 8 排序 | 9 图表 | 0 退出 + +请输入想要操作的选项*-*:6 +请输入需要修改的商品id:100 +您输入的商品名称没有找到!! + +``` + + + +#### C8: 删除库存记录 + +选择菜单命令 `7`,根据提示输入零件编号,若零件存在,则删除之;否则提示零件不存在并结束。 + +``` + +请输入想要操作的选项*-*:7 +请输入需要删除的商品id:100 +您输入的商品名称没有找到!! + +1 读取 | 2 保存 | 3 打印 | 4 查询 | 5 添加 +6 修改 | 7 删除 | 8 排序 | 9 图表 | 0 退出 + +请输入想要操作的选项*-*:7 +请输入需要删除的商品id:101 +商品 101 已被删除!! + +1 读取 | 2 保存 | 3 打印 | 4 查询 | 5 添加 +6 修改 | 7 删除 | 8 排序 | 9 图表 | 0 退出 + +请输入想要操作的选项*-*:3 +商品的id:101 +您的数据库内没有商品! + +``` + + + +#### C9: 库存记录排序 + +选择菜单命令 `8`,对库存记录按零件编号从小到大排序。 + +``` +请输入想要操作的选项*-*:3 +商品的id:101 +商品的名称:电脑 +商品的数量:20 + +1 读取 | 2 保存 | 3 打印 | 4 查询 | 5 添加 +6 修改 | 7 删除 | 8 排序 | 9 图表 | 0 退出 + +请输入想要操作的选项*-*:8 +排序 +排序已完成 + +1 读取 | 2 保存 | 3 打印 | 4 查询 | 5 添加 +6 修改 | 7 删除 | 8 排序 | 9 图表 | 0 退出 + +请输入想要操作的选项*-*:3 + +商品的id:101 +商品的名称:电脑 +商品的数量:20 +``` + +#### C10: 从文件中读取库存记录 + +选择菜单命令 `1`,提示输入文件名,若文件存在,则打开文件读取 CSV 格式保存的所有库存记录;否则,若文件不存在,则给出错误信息并结束。 + +假设文件 `a.csv` 中,以 CSV (Comma-Separated Values)格式保存了如下记录: + +``` +103,显示器,8 +104,手机,12 +101,电脑,20 +102,打印机,10 +``` + +则读取记录的过程如下: + +``` +请输入想要操作的选项*-*:1 +读取数据 +请输入文件名:data1.csv +数据库种有4种商品信息 +读取 4 记录 + +1 读取 | 2 保存 | 3 打印 | 4 查询 | 5 添加 +6 修改 | 7 删除 | 8 排序 | 9 图表 | 0 退出 + +请输入想要操作的选项*-*:3 +商品的id:103 +商品的名称:显示器 +商品的数量:8 + + +1 读取 | 2 保存 | 3 打印 | 4 查询 | 5 添加 +6 修改 | 7 删除 | 8 排序 | 9 图表 | 0 退出 + +请输入想要操作的选项*-*:1 +读取数据 +请输入文件名称:a +a:读取数据失败 +注意:您的数据库内没有商品信息 + +``` + + + +#### C11: 将库存保存保存到文件 + +选择菜单命令 `2`,提示输入文件名,将所有库存记录以 CSV 格式保存到指定的文件中。 + +``` +请输入想要操作的选项*-*:2 +请输入文件名:data2.csv +已经保存 1 种商品信息 + + +请输入想要操作的选项*-*:2 +您没有商品信息不用保存 + +请输入想要操作的选项*-*:2 +请输入文件名:data2.csv +文件打开失败 + +``` + + + +#### C12: 以图表方式显示库存记录 + +选择菜单命令 `9`,以图表方式显示库存记录。 + +``` +请输入想要操作的选项*-*:9 +ID | NAME Amount +您的数据库没有商品! + +请输入想要操作的选项*-*:9 +ID | NAME Amount +101 电脑 20 + +1 读取 | 2 保存 | 3 打印 | 4 查询 | 5 添加 +6 修改 | 7 删除 | 8 排序 | 9 图表 | 0 退出 + +``` + diff --git a/code/system.c b/code/system.c new file mode 100644 index 0000000..4c8d49b --- /dev/null +++ b/code/system.c @@ -0,0 +1,45 @@ + +#include +#include +#include +#include +#include "void.c" + +int main () +{ + LIST *pList = NULL; + pList = creation ( ); + readData2 ( pList ); + + while ( 1 ) + { + int choice = menu ( ); + int c1; + getchar(); + switch ( choice ) + { + case 1: + c1= menu1(); + if(c1==1) readData1 ( pList ); + if(c1==2) saveData(pList); + if(c1==3) show_goods(pList); + if(c1==4) find_goods(pList); + if(c1==5) insert(pList); + if(c1==6) increase_count(pList); + if(c1==7) delete_from_list(pList); + if(c1==8) sort(pList); + if(c1==9) Show(pList); + if(c1==0) {saveData(pList); printf("感谢使用");} + break; + case 2: + saveData ( pList ); + printf("感谢使用"); + return 0; + break; + default: + printf ("输入的信息有误,请重新输入!!!\r\n"); + break; + } + } + return 0; +} diff --git a/code/system.cpp b/code/system.cpp new file mode 100644 index 0000000..e780dd1 --- /dev/null +++ b/code/system.cpp @@ -0,0 +1,418 @@ +//sjandy sjandsy sjandsy +#include +#define Rl 1000 +using namespace std; + +#include +#include +#include +#include + +//常量定义 +#define SIZE 20 + +enum judge +{ + ERROR = -1, + OK, +}; + + +//类型定义 +struct goods +{ int id; + char name [SIZE]; + int count; +}; + +typedef struct goods dataType; + +typedef struct list +{ + dataType data; + struct list *pNext; +}LIST; + +LIST lis; + + +LIST * creation ( ) +{ + LIST *pList = NULL; + pList = ( LIST * ) malloc ( sizeof ( LIST ) ); + if ( NULL == pList ) + { + return NULL; + } + memset ( pList, 0, sizeof ( LIST ) ); + + return pList; +} + +bool add_goods(int id,char name[],int count,LIST *p){ + if ( NULL == p ) + { + return false; + } + //赋值 + strcpy(p->data.name,name); + p->data.count = count; + p->data.id=id; + return true; +} + +int insert ( LIST * pList ) +{ + //判断链表是否存在 + if ( NULL == pList ) + { + return ERROR; + } + LIST *p = creation ( ); + char name[20]; + int count=0; + int id=0; + printf("请输入id:\n"); + scanf("%d",&id); + printf("请输入商品名:\n"); + scanf("%s",&name); + printf("请输入商品数量:\n"); + scanf("%d",&count); + if(add_goods(id,name,count,p)){ + //头插法插入节点 + p->pNext = pList->pNext; + pList->pNext = p; + printf ( "商品 %s 已经添加成功\r\n", p->data.name ); + return OK; + } +} + + + + +int delete_from_list ( LIST * pList ) +{ + //判断链表是否存在,是否为空 + if ( NULL == pList + || NULL == pList->pNext ) + { + printf ( "数据库数据为空,请先添加商品信息\r\n" ); + return ERROR; + } + int s[SIZE] = {0}; + printf( "请输入需要删除的商品id\r\n" ); + scanf ( "%d", s ); + + LIST *p = pList->pNext; + LIST *q = pList; + + while ( NULL != p ) + { + if ( p->data.id == s[0] ) + { + q->pNext = p->pNext; + free ( p ); + p = NULL; + printf ( "商品 %s 信息已被删除!!\r\n", s ); + return OK; + } + p = p->pNext; + q = q->pNext; + + } + printf ( "您输入的商品名称没有找到!!\r\n" ); + return ERROR; +} + + + +int find_goods ( LIST *pList ) +{ + if ( NULL == pList + || NULL == pList->pNext ) + { + printf ( "数据库数据为空,请先添加商品信息\r\n" ); + return ERROR; + } + int s[SIZE] = {0}; + printf( "请输入需要查找的商品id\r\n" ); + scanf ( "%d", s ); + + //定义指针变量 + LIST *p = pList->pNext; + while ( NULL != p ) + { + if ( p->data.id==s[0] ) + { printf ("商品的id:%d\r\n ",p->data.id); + printf ( "商品的名称:%s\r\n", p->data.name ); + printf ( "商品的数量:%d\r\n", p->data.count ); + return OK; + } + p = p->pNext; + } + printf ( "输入的商品信息无效!!!\r\n" ); + return ERROR; +} + + +int increase_count ( LIST *pList ) +{ + //判断链表是否存在,是否为空 + if ( NULL == pList + || NULL == pList->pNext ) + { + printf ( "数据库数据为空,请先添加商品信息\r\n" ); + return ERROR; + } + + int s[SIZE] = {0}; + printf( "请输入需修改的商品id\r\n" ); + scanf ( "%d", s ); + + + LIST *p = pList->pNext; + while ( NULL != p ) + { + + if ( p->data.id==s[0] ) + { + + printf ( "原商品的数量:%d\r\n", p->data.count ); + printf ( "请输入修改的商品数量\r\n" ); + int xiugai; + scanf ( "%d", &xiugai ); + p->data.count+=xiugai; + printf ( "商品数量修改成功 *_* \r\n" ); + return OK; + } + p = p->pNext; + } + printf ( "您输入的商品名称没有找到!!\r\n"); + return ERROR; +} + + +int menu ( ) +{ + + printf ( " ==欢迎来到商品管理系统===\r\n" ); + printf("1.功能菜单 | 2.退出 \n"); + + printf ( "请输入想要操作的选项*-*\r\n" ); + int choice = 0; + + scanf ( "%d", &choice ); + + return choice; +} + +int menu1 ( ) +{ + + printf ( " ==欢迎来到商品管理系统===\r\n" ); + printf ( "1.读取 | 2. 保存 | 3. 打印 | 4. 查询 | 5. 添加\n" + "6.修改 | 7.删除 | 8.排序 | 9.图表 | 0.退出\n\n"); + + //输入选项 + printf ( "请输入想要操作的选项*-*\r\n" ); + int choice = 0; + + scanf ( "%d", &choice ); + return choice; +} + + +int show_goods ( LIST *pList ) +{ + //判断 + if ( NULL == pList + || NULL == pList->pNext ) + { + printf ( "您的数据库内没有商品!\r\n" ); + return ERROR; + } + + int count = 0; + LIST *p = pList->pNext; + while ( NULL != p ) + { + count++; + printf ( "商品的id: %d\r\n",p->data.id); + printf ( "商品的名称:%s\r\n", p->data.name ); + printf ( "商品的数量:%d\r\n", p->data.count ); + //printf ( "商品的价格:%f\r\n", p->data.price ); + printf ( "\r\n" ); + p = p->pNext; + } + printf ( "商品的种类为 %d \r\n", count ); + return count; +} + + + +void saveData ( LIST *pList ) +{ + //判断 + if ( NULL == pList + || NULL == pList->pNext ) + { + printf ( "您没有商品信息不用保存\r\n" ); + return ; + } + + FILE *fp =NULL; + fp = fopen ( "ck.csv", "w+" ); + if ( NULL == fp ) + { + printf( "文件打开失败\r\n" ); + return ; + } + LIST *p = NULL; + int count = 0; + + while ( NULL != pList->pNext ) + { + p = pList->pNext; + pList->pNext = p->pNext; + fwrite(&p->data,sizeof(p->data),1,fp); + free (p); + p = NULL; + count++; + } + free ( pList ); + pList = NULL; + + fclose ( fp ); + printf ( "已经保存 %d 种商品信息\r\n" , count ); + + return; +} + +void readData ( LIST *pList ) +{ + //判断 + if ( NULL == pList ) + { + printf ( "读取数据失败!\r\n" ); + return ; + } + FILE *fp = fopen ( "ck.csv", "rb" ); + if ( NULL == fp ) + { + printf( "注意:您的数据库内没有商品信息\r\n" ); + return ; + } + + int count = 0; + int tmp = 1; + LIST *p = NULL; + + p = creation ( ); + fread(&p->data,sizeof(p->data),1,fp); + + while ( !feof(fp) ) + { + //头插法插入节点 + p->pNext = pList->pNext; + pList->pNext = p; + count++; + p = creation ( ); + fread(&p->data,sizeof(p->data),1,fp); + } + printf ( "数据库中有 %d 种商品信息\r\n", count ); + fclose ( fp ); + + return; +} + +int Show( LIST *pList ) +{printf("ID | NAME Amount\n"); + //判断 + if ( NULL == pList + || NULL == pList->pNext ) + { + printf ( "您的数据库内没有商品!\r\n" ); + return ERROR; + } + + int count = 0; + LIST *p = pList->pNext; + while ( NULL != p ) + { + count++; + printf ( "%d ",p->data.id); + printf ( " %s ", p->data.name ); + printf ( " %d ", p->data.count ); + printf ( "\r\n" ); + p = p->pNext; + } +} +void sort(LIST *pList) +{ + int i ,count = 0, num; + LIST *p, *q, *tail; + p = pList; + while(p->pNext != NULL) + { + count++; + p = p->pNext; + } + for(i = 0; i < count - 1; i++) + { + num = count - i - 1; + q = pList->pNext; + p = q->pNext; + tail = pList; + while(num--) + { + if(q->data.id > p->data.id) + { + q->pNext = p->pNext; + p->pNext = q; + tail->pNext = p; + } + tail = tail->pNext; + q = tail->pNext; + p = q->pNext; + } + } +} + +int main ( ) +{ + LIST *pList = NULL; + pList = creation ( ); + readData ( pList ); + + while ( 1 ) + { + int choice = menu ( ); + int c1; + getchar(); + switch ( choice ) + { + case 1: + c1= menu1(); + if(c1==1) readData ( pList ); + if(c1==2) saveData(pList); + if(c1==3) show_goods(pList); + if(c1==4) find_goods(pList); + if(c1==5) insert(pList); + if(c1==6) increase_count(pList); + if(c1==7) delete_from_list(pList); + if(c1==8) sort(pList); + if(c1==9) Show(pList); + if(c1==0) {saveData(pList); printf("感谢使用");} + break; + case 2: + saveData ( pList ); + printf("感谢使用"); + return 0; + break; + default: + printf ("输入的信息有误,请重新输入!!!\r\n"); + break; + } + } + return 0; +} diff --git a/code/void.c b/code/void.c new file mode 100644 index 0000000..3e17bbe --- /dev/null +++ b/code/void.c @@ -0,0 +1,413 @@ +#include +#include +#include +#include +//常量定义 +#define SIZE 20 + +enum judge +{ + ERROR = -1, + OK, +}; + + +//类型定义 +struct goods +{ int id; + char name [SIZE]; + int count; +}; + +typedef struct goods dataType; + +typedef struct list +{ + dataType data; + struct list *pNext; +}LIST; + +LIST lis; + + +LIST * creation ( ) +{ + LIST *pList = NULL; + pList = ( LIST * ) malloc ( sizeof ( LIST ) ); + if ( NULL == pList ) + { + return NULL; + } + memset ( pList, 0, sizeof ( LIST ) ); + + return pList; +} + +bool add_goods(int id,char name[],int count,LIST *p){ + if ( NULL == p ) + { + return false; + } + //赋值 + strcpy(p->data.name,name); + p->data.count = count; + p->data.id=id; + return true; +} + +int insert ( LIST * pList ) +{ + //判断链表是否存在 + if ( NULL == pList ) + { + return ERROR; + } + LIST *p = creation ( ); + char name[20]; + int count=0; + int id=0; + printf("请输入id:\n"); + scanf("%d",&id); + printf("请输入商品名:\n"); + scanf("%s",&name); + printf("请输入商品数量:\n"); + scanf("%d",&count); + if(add_goods(id,name,count,p)){ + //头插法插入节点 + p->pNext = pList->pNext; + pList->pNext = p; + printf ( "商品 %s 已经添加成功\r\n", p->data.name ); + return OK; + } +} + + + + +int delete_from_list ( LIST * pList ) +{ + //判断链表是否存在,是否为空 + if ( NULL == pList + || NULL == pList->pNext ) + { + printf ( "数据库数据为空,请先添加商品信息\r\n" ); + return ERROR; + } + int s[SIZE] = {0}; + printf( "请输入需要删除的商品id\r\n" ); + scanf ( "%d", s ); + + LIST *p = pList->pNext; + LIST *q = pList; + + while ( NULL != p ) + { + if ( p->data.id == s[0] ) + { + q->pNext = p->pNext; + free ( p ); + p = NULL; + printf ( "商品 %s 信息已被删除!!\r\n", s ); + return OK; + } + p = p->pNext; + q = q->pNext; + + } + printf ( "您输入的商品名称没有找到!!\r\n" ); + return ERROR; +} + + + +int find_goods ( LIST *pList ) +{ + if ( NULL == pList + || NULL == pList->pNext ) + { + printf ( "数据库数据为空,请先添加商品信息\r\n" ); + return ERROR; + } + int s[SIZE] = {0}; + printf( "请输入需要查找的商品id\r\n" ); + scanf ( "%d", s ); + + //定义指针变量 + LIST *p = pList->pNext; + while ( NULL != p ) + { + if ( p->data.id==s[0] ) + { printf ("商品的id:%d\r\n ",p->data.id); + printf ( "商品的名称:%s\r\n", p->data.name ); + printf ( "商品的数量:%d\r\n", p->data.count ); + return OK; + } + p = p->pNext; + } + printf ( "输入的商品信息无效!!!\r\n" ); + return ERROR; +} + + +int increase_count ( LIST *pList ) +{ + //判断链表是否存在,是否为空 + if ( NULL == pList + || NULL == pList->pNext ) + { + printf ( "数据库数据为空,请先添加商品信息\r\n" ); + return ERROR; + } + + int s[SIZE] = {0}; + printf( "请输入需修改的商品id\r\n" ); + scanf ( "%d", s ); + + + LIST *p = pList->pNext; + while ( NULL != p ) + { + + if ( p->data.id==s[0] ) + { + + printf ( "原商品的数量:%d\r\n", p->data.count ); + printf ( "请输入修改的商品数量\r\n" ); + int xiugai; + scanf ( "%d", &xiugai ); + p->data.count+=xiugai; + printf ( "商品数量修改成功 *_* \r\n" ); + return OK; + } + p = p->pNext; + } + printf ( "您输入的商品名称没有找到!!\r\n"); + return ERROR; +} + + +int menu ( ) +{ + + printf ( " ==欢迎来到商品管理系统===\r\n" ); + printf("1.功能菜单 | 2.退出 \n"); + + printf ( "请输入想要操作的选项*-*\r\n" ); + int choice = 0; + + scanf ( "%d", &choice ); + + return choice; +} + +int menu1 ( ) +{ + + printf ( " ==欢迎来到商品管理系统===\r\n" ); + printf ( "1.读取 | 2. 保存 | 3. 打印 | 4. 查询 | 5. 添加\n" + "6.修改 | 7.删除 | 8.排序 | 9.图表 | 0.退出\n\n"); + + //输入选项 + printf ( "请输入想要操作的选项*-*\r\n" ); + int choice = 0; + + scanf ( "%d", &choice ); + return choice; +} + + +int show_goods ( LIST *pList ) +{ + //判断 + if ( NULL == pList + || NULL == pList->pNext ) + { + printf ( "您的数据库内没有商品!\r\n" ); + return ERROR; + } + + int count = 0; + LIST *p = pList->pNext; + while ( NULL != p ) + { + count++; + printf ( "商品的id: %d\r\n",p->data.id); + printf ( "商品的名称:%s\r\n", p->data.name ); + printf ( "商品的数量:%d\r\n", p->data.count ); + //printf ( "商品的价格:%f\r\n", p->data.price ); + printf ( "\r\n" ); + p = p->pNext; + } + printf ( "商品的种类为 %d \r\n", count ); + return count; +} + + + +void saveData ( LIST *pList ) +{ + //判断 + if ( NULL == pList + || NULL == pList->pNext ) + { + printf ( "您没有商品信息不用保存\r\n" ); + return ; + } + printf("输入文件名称: "); + char str=getchar(); + FILE *fp =NULL; + fp = fopen ( "data2.csv", "w+" ); + if ( NULL == fp ) + { + printf( "文件打开失败\r\n" ); + return ; + } + LIST *p = NULL; + int count = 0; + + while ( NULL != pList->pNext ) + { + p = pList->pNext; + pList->pNext = p->pNext; + fwrite(&p->data,sizeof(p->data),1,fp); + free (p); + p = NULL; + count++; + } + free ( pList ); + pList = NULL; + + fclose ( fp ); + printf ( "已经保存 %d 种商品信息\r\n" , count ); + + return; +} + +void readData1 ( LIST *pList ) +{ + //判断 + if ( NULL == pList ) + { + printf ( "读取数据失败!\r\n" ); + return ; + } + FILE *fp = fopen ( "data1.csv", "rb" ); + if ( NULL == fp ) + { + printf( "注意:您的数据库内没有商品信息\r\n" ); + return ; + } + + int count = 0; + int tmp = 1; + LIST *p = NULL; + + p = creation ( ); + fread(&p->data,sizeof(p->data),1,fp); + + while ( !feof(fp) ) + { + //头插法插入节点 + p->pNext = pList->pNext; + pList->pNext = p; + count++; + p = creation ( ); + fread(&p->data,sizeof(p->data),1,fp); + } + printf ( "数据库中有 %d 种商品信息\r\n", count ); + fclose ( fp ); + + return; +} +void readData2 ( LIST *pList ) +{ + //判断 + if ( NULL == pList ) + { + printf ( "读取数据失败!\r\n" ); + return ; + } + + printf("输入文件名称: "); + char str=getchar(); + FILE *fp = fopen ( "data2.csv", "rb" ); + if ( NULL == fp ) + { + printf( "注意:您的数据库内没有商品信息\r\n" ); + return ; + } + + int count = 0; + int tmp = 1; + LIST *p = NULL; + + p = creation ( ); + fread(&p->data,sizeof(p->data),1,fp); + + while ( !feof(fp) ) + { + //头插法插入节点 + p->pNext = pList->pNext; + pList->pNext = p; + count++; + p = creation ( ); + fread(&p->data,sizeof(p->data),1,fp); + } + printf ( "数据库中有 %d 种商品信息\r\n", count ); + fclose ( fp ); + + return; +} + +int Show( LIST *pList ) +{printf("ID | NAME Amount\n"); + //判断 + if ( NULL == pList + || NULL == pList->pNext ) + { + printf ( "您的数据库内没有商品!\r\n" ); + return ERROR; + } + + int count = 0; + LIST *p = pList->pNext; + while ( NULL != p ) + { + count++; + printf ( "%d ",p->data.id); + printf ( " %s ", p->data.name ); + printf ( " %d ", p->data.count ); + printf ( "\r\n" ); + p = p->pNext; + } +} +void sort(LIST *pList) +{ + int i ,count = 0, num; + LIST *p, *q, *tail; + p = pList; + while(p->pNext != NULL) + { + count++; + p = p->pNext; + } + for(i = 0; i < count - 1; i++) + { + num = count - i - 1; + q = pList->pNext; + p = q->pNext; + tail = pList; + while(num--) + { + if(q->data.id > p->data.id) + { + q->pNext = p->pNext; + p->pNext = q; + tail->pNext = p; + } + tail = tail->pNext; + q = tail->pNext; + p = q->pNext; + } + } +} diff --git a/data/data1.csv b/data/data1.csv new file mode 100644 index 0000000..e69de29 diff --git a/data/data2.csv b/data/data2.csv new file mode 100644 index 0000000..e69de29 diff --git a/graph/a b/graph/a new file mode 100644 index 0000000..e69de29