数据结构课程设计
来源:互联网 发布:位面淘宝txt 编辑:程序博客网 时间:2024/06/08 14:27
一.源程序代码
1. 头文件 goods.h
#ifndef GOODS_H_INCLUDED#define GOODS_H_INCLUDED#include<stdlib.h>#include <stdio.h>#include <conio.h>#include <string.h>#include <malloc.h>#define MAXSIZE 100typedef struct //数据域定义为一个结构体{ char name[30]; //商品名称 char no[30]; //商品编号 int num; //商品数量}goods; //商品结构体typedef struct node //定义单链表节点类型{ goods data; //数据域 struct node *next; //指针域,指向后继结点}LNode;LNode *Init_G(); //初始化链表void input(LNode *L); //创建链表(尾插法)void run_over(LNode *L); //浏览商品信息LNode* search(LNode *L,goods x); //查找商品void goodspai(LNode *L); //商品信息排序void insert(LNode *L,goods x); //插入商品void storage(LNode *L,goods x); //商品入库void goodsChange(LNode *L,goods x); //以商品编号进行修改int del(LNode *L,goods x); //删除void out(LNode *L,goods x); //商品出库void save(LNode *L); //保存操作void menu(); //功能选择窗口 //#endif // GOODS_H_INCLUDED
2.实现函数功能的cpp文件 goods.cpp
#include "goods.h"#include <windows.h>#include <time.h>/************************************* 功能描述:录入商品信息* 输入参数:输入录入个数及需要录入的信息* 输出参数:无* 备注信息:尾插法创建链表*************************************/void input(LNode *L) //尾插法创建链表{ int i,n; LNode *r=L,*s; goods x; printf("\n请输入商品的种数:"); scanf("%d",&n); printf("\n **** 请输入商品的名称、编号、数量 ****\n"); printf("\n"); for(i=1;i<=n;i++) { printf(" o商品名称: "); scanf("%s",x.name); printf(" o商品编号: "); scanf("%s",x.no); printf(" o商品数量: "); scanf("%d",&x.num); s=(LNode*)malloc(sizeof(LNode)); s->data=x; s->next=NULL; r->next=s; r=s; printf("\n"); } printf("\n **** 录入结束,返回上一级 ****\n");}/************************************* 功能描述:浏览商品信息清单* 输入参数:无* 输出参数:所有商品信息* 备注信息:链表的遍历及输出*************************************/void run_over(LNode *L){ LNode *p=L->next; if(p==NULL) { printf("--------------该系统还未录入商品信息,请录入后在进行操作--------------\n"); menu(); } printf("\n-----------下面是商品信息一览表-----------\n"); printf("\n"); printf("商品名称 商品编号 商品数量\n"); printf("\n"); while(p!=NULL) { printf("%5s%10s%12d\n",p->data.name,p->data.no,p->data.num); p=p->next; } printf("\n"); printf("\n");}/************************************* 功能描述:查找商品信息* 输入参数:要查找的商品编号* 输出参数:商品信息* 备注信息:按元素值在链表中查询*************************************/LNode* search(LNode *L,goods x){ LNode *p=L->next; while(p!=NULL&&(strcmp(p->data.no,x.no)!=0)) { p=p->next; } if(p!=NULL&&(strcmp(p->data.no,x.no)==0)) //查找到相应商品,返回指针 { return p; } else { return NULL; }}/************************************* 功能描述:插入新增商品* 输入参数:新增商品的编号,名称及数量* 输出参数:无* 备注信息:链表的插入*************************************/void insert(LNode *L,goods x){ LNode *p=L,*s; while(p->next!=NULL&&(strcmp(p->next->data.no,x.no)!=0)) //商品不存在时可插入到已有链表上 { p=p->next; } s=(LNode*)malloc(sizeof(LNode)); s->data=x; s->next=p->next; p->next=s;}/************************************* 功能描述:排序商品信息* 输入参数:无* 输出参数:无* 备注信息:直接插入排序和冒泡排序*************************************/void goodspai(LNode *L){ LNode *p,*q,*r; int choose; goods x; printf("请选择排序方式:"); printf("1.按商品编号排序 2.按库存数量排序 \n"); scanf("%d",&choose); switch(choose) { case 1: //按商品编号排序为直接插入排序 p=L->next->next; //p指向第一个节点的后继 L->next->next=NULL; //直接插入排序,第一个元素在有序区,从第二元素起依次插入 while(p!=NULL) { r=p->next; //r指针暂存p的后继 q=L; while(q->next!=NULL&&(strcmp(q->next->data.no,p->data.no)>0)) //查找插入位置 q=q->next; //将p节点链入链表 p->next=q->next; q->next=p; p=r; } break; case 2: //按商品数量排序为冒泡排序 p=L->next; while(p) { q=p->next; while(q) { if(p->data.num<=q->data.num) { x=p->data; p->data=q->data; q->data=x; } q=q->next; } p=p->next; } break; }}/************************************* 功能描述:商品入库* 输入参数:入库商品信息* 输出参数:无* 备注信息:无*************************************/void storage(LNode *L,goods x){ LNode *p; p=search(L,x); if(p==NULL) //链表中没有这个商品时可直接插入 { insert(L,x); } else { p->data.num=p->data.num+x.num; //链表中中有这个商品时只增加商品的数量 }}/************************************* 功能描述:商品信息修改* 输入参数:商品编号* 输出参数:无* 备注信息:无*************************************/void goodsChange(LNode *L,goods x) //以商品编号进行修改{ LNode *p; char chname[30]; char chno[30]; int chnum; p=search(L,x); if(p==NULL) { printf("\n仓库中无此商品!\n"); } else { printf("\n o 修改商品编号: "); scanf("%s",chno); strcpy(p->data.no,chno); printf("\n o 修改商品名称: "); scanf("%s",chname); strcpy(p->data.name,chname); printf("\n o 修改商品数量: "); scanf("%d",&chnum); p->data.num=chnum; printf("\n √成功修改!\n"); printf("\n"); }}/************************************* 功能描述:删除商品* 输入参数:要删除的商品编号* 输出参数:无* 备注信息:删除链表元素*************************************/int del(LNode *L,goods x) //删除商品信息{ LNode *p; long n; int flag=0; //flag为判断商品是否删除的标志 p=L; for(; p!=NULL; p=p->next) { if(p->next!=NULL&&(strcmp(p->next->data.no,x.no)==0)) { p->next=p->next->next; //删除语句 flag=1; break; } } if(p==NULL&&flag==0) { printf("\n 不存在此商品!"); printf("\n--------------------------------------------------"); menu(); } return 1;}/************************************* 功能描述:商品出库* 输入参数:出库商品及出库数量* 输出参数:是否购买成功* 备注信息:模拟超市实际购买操作,增加系统可用性*************************************/void out(LNode *L,goods x){ int j; LNode *p; p=search(L,x); if(p==NULL) { printf("\n仓库中无此商品!\n"); } else { printf("\n 您要购买的商品为:%s。\n",p->data.name); if(p->data.num>x.num) //购买的商品数量少于库存量时 { printf("\n购买成功!欢迎下次光临!\n"); p->data.num=p->data.num-x.num; //库存数=原库存数-购买数 printf("\n"); printf("\n该商品还有%d件。\n",p->data.num); //显示现在的库存 } else if(p->data.num==x.num) //购买的商品数量等于库存量时 { printf("\n购买成功!欢迎下次光临!\n"); del(L,x); //调用删除函数,系统显示已售空 printf("\n"); printf("\n该商品已售空,请及时补充库存。\n"); } else if(p->data.num<x.num) //购买的商品数量多于库存量时 { printf("\n该商品数量不足,仅剩%d。是否购买\n",p->data.num); printf("(购买请按1,不购买请按0。)\n"); printf("请输入您的的选择:"); scanf("%d",&j); if(j==1) { del(L,x); //若选择购买,则把剩余的该商品全部买走 printf("\n购买成功!欢迎下次光临!\n"); printf("\n"); printf("\n该商品已售空,请及时补充库存。\n"); } else { printf("\n欢迎下次光临!\n"); } } }}/************************************* 功能描述:保存操作数据* 输入参数:无* 输出参数:所有信息* 备注信息:把数据写入文件*************************************/void save(LNode *L) //保存操作结果{ int i; LNode *p=L->next, *q=L->next; FILE *fp; //文件指针 if(p==NULL) { printf("现在没有商品信息,请先输入信息再进行操作\n"); return; } fp=fopen("goods.txt","w"); //在当前目录下打开goods.txt文件并设置只允许“写”操作 if(!fp) { printf("文件不存在\n"); return; } //将商品信息写入文件 fprintf(fp,"===========================商品信息一览表===========================\n"); fprintf(fp,"\n"); fprintf(fp,"商品名称\t商品编号\t商品数量\n"); while(p!=NULL) { fprintf(fp,"%s\t\t%s\t\t%d\t\t",p->data.name,p->data.no,p->data.num); fprintf(fp,"\n"); p=p->next; } fclose(fp); //把缓冲区内最后剩余的数据输出到内核缓冲区,并释放文件指针 printf("数据已成功导入文件goods.txt!\n");}/************************************* 功能描述:显示系统功能界面* 输入参数:无* 输出参数:无* 备注信息:无*************************************/void menu(){ printf("\n\n\n\n\n\n"); printf("************************欢迎进入超市商品管理系统************************\n"); printf("\n\n"); system("color 74"); printf("请稍后...\n"); for(int k=0;k<75;k++) { Sleep(30); printf(">"); } system("cls"); printf("\n\n\n\n\n\n"); printf(" ┏━━━━━━━━━━━━━━━━━━┓\n"); printf(" ┃ ┃\n"); printf(" ┃ 请选择您要操作的项目 ┃\n"); printf(" ◥◤~~~~◥◤ ┃ ┃\n"); printf(" ┃ 1 录入商品信息 ┃\n"); printf("┃ ┃ ┃ ┃\n"); printf(" ┃ 2 浏览商品清单 ┃\n"); printf(" ≡━ ﹏ ━≡ ┃ ┃\n"); printf(" ┃ 3 查找商品信息 ┃\n"); printf("┗━━┳∞┳━━┛ ┃ ┃\n"); printf(" ┃ 4 修改商品信息 ┃\n"); printf(" ┏┫ ┣┓ ┃ ┃\n"); printf(" ┃ 5 商品信息排序 ┃\n"); printf(" ┃ ┃\n"); printf(" ┃ 6 商品入库 ┃\n"); printf(" ┃ ┃\n"); printf(" ┃ 7 商品出库 ┃\n"); printf(" ┃ ┃\n"); printf(" ┃ 8 删除商品 ┃\n"); printf(" ┃ ┃\n"); printf(" ┃ 9 保存操作 ┃\n"); printf(" ┃ ┃\n"); printf(" ┃ 0 退出系统 ┃\n"); printf(" ┗━━━━━━━━━━━━━━━━━━┛\n");}3.main函数
#include "goods.h"#include <windows.h>#include <time.h>int main(){ goods x; int sel; LNode *L,*p; L=(LNode *)malloc(sizeof(LNode)); do { menu(); printf("\n"); printf("\n"); printf(" o 请输入您的选择:\n"); scanf("%d",&sel); switch(sel) { case 1: printf("\n您选择了录入商品信息功能!\n\n"); input(L); Sleep(2000); system("cls"); break; case 2: printf("\n您选择了浏览商品清单功能!\n\n"); printf("\n"); run_over(L); Sleep(2000); system("cls"); break; case 3: printf("\n您选择了查找商品信息功能!\n\n"); printf("\n"); printf("\n请输入要查找的商品的编号:\n"); printf("\n"); printf("您输入的编号为:"); printf("\n"); scanf("%s",x.no); p=search(L,x); if(p==NULL) { printf("\n该商品不存在。\n"); } else { printf("\n商品名称 商品编号 商品数量\n"); printf("%5s%10s%12d\n",p->data.name,p->data.no,p->data.num); } Sleep(2000); system("cls"); break; case 4: printf("\n您选择了修改商品信息功能!\n\n"); printf("\n"); printf("\n请输入要修改的商品的编号:\n"); printf("\n"); printf(" o商品编号: "); scanf("%s",x.no); goodsChange(L,x); Sleep(2000); system("cls"); break; case 5: goodspai(L); printf("\n已完成排序,若要查看排序后的结果,请回到初始界面。 \n"); Sleep(2000); system("cls"); break; case 6: printf("\n您选择了商品入库功能!\n\n"); printf("\n"); printf("\n请输入要入库的商品的名称、编号及数量:\n"); printf("\n"); printf(" o商品名称: "); scanf("%s",x.name); printf(" o商品编号: "); scanf("%s",x.no); printf(" o商品数量: "); scanf("%d",&x.num); storage(L,x); printf("\n √入库成功! \n"); Sleep(2000); system("cls"); break; case 7: printf("\n您选择了商品出库功能!\n\n"); printf("\n"); printf("\n请输入要出库的商品的编号、数量:\n"); printf("\n"); printf(" o商品编号: "); scanf("%s",x.no); printf(" o商品数量: "); scanf("%d",&x.num); out(L,x); Sleep(2000); system("cls"); break; case 8: printf("\n您选择了商品删除功能!\n\n"); printf("\n"); printf("\n请输入要出库的商品的编号:\n"); printf("\n"); printf(" o商品编号: "); scanf("%s",x.no); del(L,x); printf("\n √成功删除!"); printf("\n"); printf("\n---------------------------------------------"); Sleep(2000); system("cls"); break; case 9: printf("\n您选择了保存操作功能!\n\n"); printf("\n"); save(L); printf("\n √保存成功!"); break; } } while(sel!=0); printf("感谢您的使用,再见!\n"); return 0;}二、程序运行截图
1.初始界面
2.录入商品信息
浏览当前商品清单
4.修改商品信息
输入有误时
输入无误时
浏览修改后的商品信息
5.商品信息排序
按编号排序
浏览排序后的信息
按库存量排序
浏览排序后的信息
6.查找商品信息
商品不存在时
商品存在时
7.商品入库
浏览商品入库后的信息
8.商品出库
购买数量小于库存数时
购买数量等于库存数时
购买数量大于库存数时
浏览出库后的商品信息
9.删除商品信息
浏览删除后的信息
11.把商品信息写入文件
12.退出系统
阅读全文
0 0
- 数据结构课程设计
- 数据结构课程设计
- 课程设计----数据结构
- 数据结构课程设计
- 数据结构课程设计
- 数据结构课程设计
- 数据结构课程设计
- 数据结构课程设计
- 数据结构课程设计
- 《数据结构》课程设计
- 数据结构课程设计
- 数据结构课程设计
- 数据结构课程设计
- 数据结构课程设计
- 数据结构课程设计
- 数据结构课程设计
- 数据结构课程设计
- 数据结构 课程设计
- 教你如何开发一款实用的完整Android App,附源码
- spring jdbc 使用
- ATPCS 和 AAPCS
- 条款08:别让异常逃离析构函数
- 从开博到现在的情况
- 数据结构课程设计
- 235. Lowest Common Ancestor of a Binary Search Tree
- oracle中去掉回车换行空格的方法详解
- @Configuration的使用
- php限制id为汉字
- jquery2.2.3的serialize方法如果产生错误的处理方法
- 电商独立购物车
- python学习—Day48—celery多实例与定时任务
- AOP的底层实现-CGLIB动态代理和JDK动态代理