📄 商品.cpp
字号:
//登陆密码为123456
#include"stdio.h"
#include"stdlib.h"
#include "malloc.h"
#include"string.h"
#include"conio.h"
typedef struct{
char num[5]; //商品编号
char name[5]; //商品名称
char price[4]; //商品价格
char time[7]; //生产日期
char place[5]; //存储货架号
}DataType;
typedef struct node{ //结点类型定义
DataType data; //结点数据域
struct node *next; //结点指针域
}LinkNode;
typedef LinkNode *LinkList;
LinkList head; //定义指向单链表的头指针
LinkNode *p; //定义一个指向结点的指针变量
FILE *fp;
openfile(LinkList &head);
savefile(LinkList head);
void login(void);
LinkList CreateList(void);
void InsertNode(LinkList &head,LinkNode *p);
LinkNode *ListFind(LinkList head);
void DelNode(LinkList head);
void PrintList(LinkList head);
void main()
{int i; //选择
openfile(head); //打开文件
login();
while(1){ //主菜单
printf("\n------------------欢迎使用商品信息管理系统-------------------\n");
printf("---------------------------主菜单-----------------------------\n";)
printf("---0.创建商品信息文件\n");
printf("---1.显示所有商品信息\n");
printf("---2.查找商品信息\n");
printf("---3.插入商品信息\n");
printf("---4.删除商品信息\n");
printf("---5.退出系统\n");
printf("---------------------------------------------------------------\n");
printf("请输入所要操作的号码(0-5):");
scanf("%d",&i);
printf("\n");
switch(i)
{case 0:
printf("---------------------------------------------------------------\n");
printf("*********************创建商品信息文件***********************\n");
head=CreateList(); //创建商品信息链表函数调用
break;
case 1:
printf("---------------------------------------------------------------\n");
printf("*********************显示商品信息文件***********************\n");
PrintList(head); //商品信息输出函数调用
getch();
break;
case 2:
printf("---------------------------------------------------------------\n");
printf("*********************商品信息查询***********************\n");
p=ListFind(head); //商品信息查询函数调用
if(p!=NULL){ //打印所查询到的商品信息
printf("\n\n商品编号\t商品名称\t商品价格\t生产日期\t存储货架号\n");
printf("%s\t\t%s\t\t%s\t\t%s\t\t%s\n",p->data.num,p->data.name,p->data.price,p->data.time,p->data.place);
}
else
printf("没有查询到该商品!\n");
getch();
break;
case 3:
printf("---------------------------------------------------------------\n");
printf("*********************插入商品信息***********************\n");
p=(LinkNode *)malloc(sizeof(LinkNode));
printf("\n\n商品编号:"); //输入所要插入的商品信息
scanf("%s",p->data.num);
printf("\n商品名称:");
scanf("%s",p->data.name);
printf("\n商品价格:");
scanf("%s",p->data.price);
printf("\n生产日期:");
scanf("%s",p->data.time);
printf("\n存储货架号:");
scanf("%s",p->data.place);
InsertNode(head,p); //插入商品信息函数调用
getch();
break;
case 4:
printf("---------------------------------------------------------------\n");
printf("*********************删除商品信息***********************\n");
DelNode(head); //删除商品信息函数调用
printf("按任意键返回.");
getch();
break;
default:
savefile(head); //保存所有操作的信息
printf("谢谢使用此系统,再见!\n");
exit(1);
break;
}
system("cls"); //清屏
}
}
void login() //登陆密码为123456
{long sec; //密码
printf("------------------欢迎进入登陆系统-------------------\n");
re:printf("请输入密码:");
scanf("%ld",&sec);
printf("\n");
if(sec==123456) return;
else printf("密码错误!请重新输入!\n");
goto re;
}
LinkList CreateList(void) //创建商品信息链表
{LinkList head=(LinkNode*)malloc(sizeof(LinkNode)); //申请头结点
LinkNode *p,*rear;
char flag='y'; //结束标志
rear=head; //尾指针初始指向头结点
while(flag=='y'||flag=='Y')
{p=(LinkNode*)malloc(sizeof(LinkNode));
printf("\n\n商品编号:");
scanf("%s",p->data.num);
printf("\n商品名称:");
scanf("%s",p->data.name);
printf("\n商品价格:");
scanf("%s",p->data.price);
printf("\n生产日期:");
scanf("%s",p->data.time);
printf("\n存储货架号:");
scanf("%s",p->data.place);
rear->next=p; //新结点连接到尾结点之后
rear=p; //尾指针指向新结点
printf("是否继续?(y/n):");
flag = getch();
}
rear->next=NULL; //终端结点指针域置空
return head; //返回链表头指针
}
void InsertNode(LinkList &head,LinkNode *p) //插入商品信息
{LinkList p1,p2;
p1=head;
p2=p1->next;
while(p2!=NULL && strcmp(p2->data.num,p->data.num)<0)
{p1=p2; //p1指向刚访问过的结点
p2=p2->next; //p2指向表的下一个结点
}
p1->next=p; //插入p所指向的结点
p->next=p2; //连接表中剩余部分
}
LinkNode *ListFind(LinkList head) //查找商品信息
{LinkNode *p;
char num[5];
char name[9];
int xz;
printf("---------------------------------------------------------------\n");
printf("1.按商品号查询\n");
printf("2.按商品名称查询\n");
printf("---------------------------------------------------------------\n");
printf("****************************请选择*****************************\n");
p=head->next; //假定表带头结点
scanf("%d",&xz);
printf("\n");
if(xz==1){
printf("请输入商品号:");
scanf("%s",num);
while(p && strcmp(p->data.num,num)<0)
p=p->next;
if(p==NULL||strcmp(p->data.num,num)>0)
p=NULL; //没有查找到
}
else if(xz==2){
printf("请输入商品名称:");
scanf("%s",name);
while(p && strcmp(p->data.name,name)!=0)
p=p->next;
}
return p;
}
void DelNode(LinkList head) //删除商品信息
{LinkNode *p,*q;
char name[9];p=head;
printf("请输入需要删除的商品名称:");
scanf("%s",name);
while(p && strcmp(p->data.name,name)!=0)
p=p->next;
if(p==NULL){
printf("没有找到该商品信息!\n");
return;
}
q=head;
while(q!=NULL && q->next!=p)
q=q->next;
q->next=p->next; //删除结点
free(p); //释放被删除的结点空间
printf("该商品已被删除!\n");
}
void PrintList(LinkList head)
{
LinkNode *p;
p=head->next; //因为链表带头结点,使p指向链表开始结点
printf("\n\n商品编号\t商品名称\t商品价格\t生产日期\t存储货架号\n");
while(p!=NULL){
printf("%s\t\t%s\t\t%s\t\t%s\t\t%s\n",p->data.num,p->data.name,p->data.price,p->data.time,p->data.place);
p=p->next;
}
}
openfile(LinkList &head)
{ FILE*fp;
LinkNode *p,*r;
head=(LinkNode*)malloc(sizeof(LinkNode));
head->next=NULL ;
r=head;
fp=fopen("file.txt","ab+"); //以读写打开一个二进制文件进行追加文件名file.txt
if((fp==NULL))
{
printf("文件不能打开!");
return 0 ;
}
while(!feof(fp)) //文件结束时退出循环
{ p=(LinkNode *)malloc(sizeof(LinkNode)); //将文件的内容放入接点中
if(fread(p,sizeof(LinkNode),1,fp)==1)
{
p->next=NULL ;
r->next=p ;
r=p; //将该接点挂入链中
}
}
fclose(fp);
}
savefile(LinkList head)
{ FILE*fp;
LinkNode*p;
fp=fopen("file.txt","wb");//只写方式打开
if(fp==NULL)
{
printf("文件不能打开!");
return 0;
}
p=head->next;
while(p){
if(fwrite(p,sizeof(LinkNode),1,fp)==1)
{
p=p->next;
}
else break;
}
fclose(fp);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -