# 一、实验名称:
超市商品管理系统链表实现
# 二、实验学时:4学时
# 三、实验目的:
1. 掌握单链表的定义和使用方法
2. 掌握单链表的建立方法
3. 掌握单链表中节点的查找与删除
4. 掌握输出单链表节点的方法
5. 掌握链表节点排序的一种方法
6. 掌握C语言创建菜单的方法
7. 掌握结构体的定义和使用方法
# 四、实验原理:
1、 单链表的数据操作
2、 基本语法的使用
3、 C语言文件操作函数的理解和使用
4、 Visual Studio开发环境
# 五、实验内容:
1、 创建单链表并将其定义为新类型 goodlist ,同时定义inventory为链表头节点。
2、 使用c语言文件操作函数fopen , fclose , fprintf , fscanf与fprintf_s,fscanf_s等打开指定txt文件,并读取txt文件内容。
3、 将读取到的内容录入到链表。
4、 输出超市系统封面(main函数)。
![](https://www.writebug.com/myres/static/uploads/2021/10/31/0f2493f549285e3de665fca921215d09.writebug)
5、 完善链表操作函数
void insert(void);查重,确认无重复后,将新商品插入。
![](https://www.writebug.com/myres/static/uploads/2021/10/31/3c16cee7b6b1cdeb5ab5dcd8028bcc10.writebug)
void search(void);查找所需函数,若没有则打印错误信息。
void update(void);寻找目标节点,提示用户输入新信息,若没有,打印错误信息
![](https://www.writebug.com/myres/static/uploads/2021/10/31/28022d95891b722755ea31945d1e165b.writebug)
![](https://www.writebug.com/myres/static/uploads/2021/10/31/4266d065cd01695d634f668942bfb570.writebug)
void deletes(void);提示用户输入信息,寻找目标信息,若存在,则删除,若不在则打印错误信息。
![](https://www.writebug.com/myres/static/uploads/2021/10/31/2498b2fd991dde4e6ecfa3803a6a4fb9.writebug)
![](https://www.writebug.com/myres/static/uploads/2021/10/31/eef781f14d98e328d86c49234bab7e72.writebug)
void print(void);将商品信息从头开始打印。
![](https://www.writebug.com/myres/static/uploads/2021/10/31/8493bc4a7115a231cc0271ec020d7439.writebug)
void bubblesort(void);冒泡排序。按照价格或者序号进行排序。
![](https://www.writebug.com/myres/static/uploads/2021/10/31/84bc965ea8a682d7bf674ff5a07bc39c.writebug)
![](https://www.writebug.com/myres/static/uploads/2021/10/31/0477c050f0ac54436e90ca898414a0c7.writebug)
# 六、实验器材(设备、元器件):
个人电脑一台
# 七、实验步骤:
1、 阅读实验要求,明确实验目的
2、 查阅相关资料,为编写程序做好准备
3、 编写程序
4、 运行测试
5、 提交老师审查
# 八、实验结果与分析(含重要数据结果分析或核心代码流程分析)
### 代码1-1创建单链表并定义头节点
```cpp
typedef struct goods {
int number;
int price;
char name[MAX_NAME_LEN + 1];
char goods_discount[MAX_DISCOUNT_LEN + 1];
int on_hand;
struct goods *next;
}goodslist;
goodslist *inventory;
```
创建单链表并将其定义为新声明goodslist方便以后的使用,然后定义inventory为头节点。
### 代码1-2定义系统需要调用的函数
```cpp
//系统主体功能(单链表的操作)
void insert(void);
void search(void);
void update(void);
void deletes(void);
void print(void);
void bubblesort(void);
//文件操作函数及退出函数
void goodslist_init(void);
void save_to_file_exit(void);
void DestroyGoods(goodslist* inventory);
```
将系统分割为几大功能块,并将其定义为各个函数,精简main函数的同时,明确目标及操作流程。
### 代码1-3输出系统封面(即完善main函数)
```cpp
int main(void)
{
int choice;
goodslist_init();
while(1)
{
printf("Supermarket Goods Manage System\n");-
printf("********************************************\n");
printf("1. show all the goods:\n");
printf("2. update one good:\n");
printf("3. insert one good:\n");
printf("4. delete one good:\n");
printf("5. search one good:\n");
printf("6. save and exit:\n");
printf("7. bubble sort by price(optional question):\n");
printf("********************************************\n");
printf("enter your choice: ");
scanf_s("%d", &choice,20);
switch (choice)
{
case 1:print(); break;
case 2:update(); break;
case 3:insert(); break;
case 4:deletes(); break;
case 5:search(); break;
case 6:save_to_file_exit(); break;
case 7:bubblesort(); break;
default:printf("Please enter a right choise!"); break;
}
printf("\n");
}
}
```
使用根据系统特点,选择使用while(1)进行外圈大循环,swich函数进行内圈小循环,选择需要执行的函数。
### 代码2-1链表初始化
```cpp
void goodslist_init(void)
{
FILE *fp;
int count = 0;
goodslist *cur, *prev;
inventory = NULL;
prev = inventory;
cur = NULL;
if ((err = fopen_s(&fp,"goodsinfo.txt", "r")) != 0)
{
if ((err = fopen_s(&fp, "goodsinfo.txt", "w")) != 0)
{
printf("TIPS:CAN NOT CREAT GOODS DATABASE FILE \n");
return;
}
else
{
printf("TIPS: now there are 0 items in list\n");
printf("Please insert new one!\n");
}//若文件不存在,新建空文件并且让用户输入新的信息
}
else {
inventory = (goodslist*)malloc(sizeof(goodslist));
fscanf_s(fp, "%d", &inventory->number,20);
fscanf_s(fp, " %s", inventory->name,20);
fscanf_s(fp, " %d", &inventory->price,20);
fscanf_s(fp, " %s", inventory->goods_discount,20);
fscanf_s(fp, " %d\n", &inventory->on_hand,20);
inventory->next=NULL;
while (!feof(fp))
{
cur = (goodslist*)malloc(sizeof(goodslist));
for (prev = inventory;
prev->next != NULL;
prev = prev->next
);
if (cur == NULL) {
printf("Database is full; can't add more goods.\n");
return;
}
prev->next = cur;
cur->next = NULL;
fscanf_s(fp, "%d", &cur->number,20);
fscanf_s(fp, " %s",cur->name,20);
fscanf_s(fp, " %d", &cur->price,20);
fscanf_s(fp, " %s", cur->goods_discount,20);
fscanf_s(fp, " %d\n", &cur->on_hand,20);
prev = cur;
count++;
}
printf("TIPS: now there are %d items in list\n", count+1);
}
cur = NULL;
prev = NULL;
fclose(fp);
fp = NULL;
}
```
打开同目录下指定文件,先初始化首节点inventory,之后逐行读取文本内容并依次存入cur节点,使用prev指针寻找到链表尾,然后将cur节点接入到链表尾,每接入一次,count+1,最后打印时加上头节点
#### 2-2-1保存链表内容到文件并清空链表内存
```cpp
void save_to_file_exit(void)
{
goodslist *cur, *prev;
int savecount = 0;//计数
FILE *fp;
if ((err = fopen_s(&fp, "newgoodsinfo.txt", "w")) != 0)
{
printf("TIPS:can not open goods file database!\n");
return;
}
for (cur = inventory, prev = NULL;
cur != NULL;
prev = cur, cur = cur->next)
{
fprintf(fp, "%d", cur->number);
fprintf(fp, " %s", cur->name);
fprintf(fp, " %d",cur->price);
fprintf(fp, " %s", cur->goods_discount);
fprintf(fp, " %d\n",cur->on_hand);
savecount++;
}
fclose(fp);
fp = NULL;
DestroyGoods(inventory);
cur = NULL;
prev = NULL;
printf("TIPS:%d items save into newgoodsinfo.txt \n", savecount );
}
```
在相对目录下创建空txt文件,使用for循环,将链表内容依次打印到txt文件中,打印结束后使用DestroyGoods函数回收内存。
#### 2-2-2清空链表所占用内存
```cpp
void DestroyGoods(goodslist* inventory) {
if (!inventory) return;
goodslist *current, *prev;
current = inventory;
while (current->next!=NULL)
{
prev = current;
current = current->next;
free(prev);
}
prev = NULL;
free(current);
current = NULL;
}
```
依次清空链表占用的内存空间
### 代码2-3链表插入新节点
```cpp
void insert(void)
{
goodslist *current, *pre,*check;
pre = inventory;
current = (goodslist*)malloc(sizeof(goodsl
神仙别闹
- 粉丝: 4236
- 资源: 7516
最新资源
- 横观水力压裂模型 pde建模 横观各向同性介质水力压裂裂纹扩展模型 使用comsol软件实现相场法模拟裂纹扩展 均基于断裂力学理论 模拟单边拉裂纹受拉伸荷载作用和受剪切荷载作用 考虑初始地应力场作用下
- 无纺布复卷检测机sw18可编辑全套技术资料100%好用.zip
- ACC自适应巡航控制模型 直 弯路控制 制动油门 安全距离计算(Simulink与PreScan联合仿真),ADS仿真模型(模型详细清晰,能够快速提升个人水平),奥迪A8 智能驾驶L2级别模型,做智能
- 相贯线焊接机sw12可编辑全套技术资料100%好用.zip
- 基于AD9361的DPSK调制解调器、位同步、误码率测试demo 零中频架构,适用于AD9361等软件无线电平台,带AD9361纯逻辑FPGA驱动,verilog代码,Vivado 2019.1工程
- 物流搬运机器人sw18可编辑全套技术资料100%好用.zip
- comsol计算光子晶体平带合并BIC,复现包含二维能带,三维能带,品质因子和远场偏振计算
- 洗瓶机的简易设计全套技术资料100%好用.zip
- C#开发的运动控制框架源码,用的凌华板卡加总线IO模块,有简单说明文档
- 三维电介质介电击穿模型 comsol相场模拟电树枝 采用三维模型模拟电介质在电场作用下介电击穿电树枝分布,电场分布和电势分布,介电击穿系列-纯聚合物电树枝生长,相场法comsol模拟,采用麦克斯韦方程
- 基于神经网络的冰数据集时间序列分析-Neural Network-based Time Series Analysis of Ice Dataset-matlab
- simpack轨道车辆建模 动力学模型 直线和曲线的动力学评价 simpack批处理变参分析,全自动preload,后台计算 matlab-simpack联合仿真批处理计算 simpack远程指导 s
- 晶体塑性有限元后处理相关脚本文件
- 1.采用matlab代码构建三维多晶模型 2.赋予模型中不同晶粒相应的取向 3.批量化输入材料参数 4.生成对应inp文件 另外,还包括黄永刚晶体塑性模型的理lunwen件和for文件,自己整理的晶体
- 新型破碎机sw17全套技术资料100%好用.zip
- addUser.jsp
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈