资源描述
#include〈iostream〉
using namespace std;
typedef struct{
char no[10];
char name[30];
int count;
}DataType;
struct Node{
DataType data;
Node *next;
};
class Link{
public:
Link(); //构造函数,建立单链表
int Insert(); //插入节点,即添加货物
Node * Search(); //查找某个节点
void Delete(); //删除节点或更改节点的数据
void show(); //输出节点信息
char Yn(); //输入(y/n)函数
char * No(); //输入货物编号函数
void Fprintf(); //将单链表数据写到文件中
void Fscanf(); //读取文件中的数据
private:
Node *first,*real,*p,*q;
};
int main()
{
int t=1,flag=1,f=1;
char n;
Node * p;
Link Ku;
while(t)
{
printf(”\n\n\n\n\n”);
printf(”\n\t\t\t**********************************”);
printf(”\n\t\t\t* XXX仓库管理系统 *");
printf(”\n\t\t\t* 1--— 存储货物 *");
printf(”\n\t\t\t* 2-—— 查询货物信息 *");
printf(”\n\t\t\t* 3——— 取出货物 *");
printf(”\n\t\t\t* 4——— 显示仓库内所有货物信息 *");
printf(”\n\t\t\t* 0—-— 退出仓库管理系统 *”);
printf("\n\t\t\t**********************************”);
printf("\n\t\t\t请选择菜单号(0——4):”);
f=1;
while(f==1)
{
cin〉>n;
if(n<’0'||n>’4')
{
printf(”输入有误,请重新输入(0—-4):");
f=1;
}
else
f=0;
}
printf(”\n\n”);
switch(n)
{
case ’1’:
{
printf(”**********************************\n”);
printf(”* 存储货物 *\n");
printf(”**********************************\n”);
//printf(” 货物编号货物名称货物数量\n”);
//printf(”**********************************\n”);
int a=1;
while(a==1)
{
a=Ku。Insert();
Ku。Fprintf();//将单链表里的数据写入文件。
}
break;
}
case '2’:
{
printf(”***********************************\n");
printf(”* 查询货物信息 *\n”);
printf(”***********************************\n”);
flag=1;
char yn;
while(flag==1)
{
p=Ku.Search();
if(p)
{
printf("\n货物编号货物名称货物数量 \n”);
printf(”-—————-——-————-——————————-—\n”);
printf(”%5s%9s%8d\n”,p—〉data。no,p—>data。name,p-〉data。count);
printf(”————--—-—--—--—-—--——————--\n”);
}
else
printf(”仓库中没有该货物!\n”);
printf("是否继续查询?(y/n):”);
yn=Ku。Yn();
if(yn==’y’||yn=='Y')
flag=1;
if(yn=='n'||yn==’N’)
flag=0;
}
break;
}
case '3’:
{
printf("***********************************\n”);
printf(”* 取出货物 *\n”);
printf(”***********************************\n");
flag=1;
char yn;
while(flag==1)
{
Ku.Delete();
printf(”是否继续取货?(y/n):”);
yn=Ku。Yn();//调用输入y/n函数
if(yn=='y’||yn=='Y’)
flag=1;
if(yn=='n'||yn==’N’)
flag=0;
}
break;
}
case '4’:
{
Ku.show();
break;
}
case ’0’:
{
char yn;
printf("确定退出仓库管理系统吗?(y/n):”);
yn=Ku。Yn();//调用输入y/n函数
if(yn==’y'||yn=='Y')
{
printf(”谢谢使用。。。\n");
t=0;
}
if(yn=='n’||yn==’N’)
{
t=1;
}
break;
}
}
}
return 0;
}
Link::Link()
{
first=new Node;
first-〉next=NULL;
real=first;
FILE *fp=NULL;
fp=fopen(”d:\\file01。txt”,"a”);
fclose(fp);
//Fprintf();
Fscanf();
}
int Link::Insert()
{
char yn;
char no[10],name[30];
int count,t;
printf("\n 货物编号货物名称(30) 货物数量(5) \n”);
printf("————-———-—--———-———--—--———-——-—-—-——--—--——---\n");
printf(”\n请输入货物编号(10个字符以内):\n”);
strcpy(no,No());
printf(”\n输入货物名称(30个字符以内):\n”);
cin〉〉name;
t=1;
while(t)
{
printf(”输入货物数量(整数): ”);
cin>>count;
if(count〈=0)
{
t=1;
printf(”货物数量必须大于0,请重新”);
}
else
t=0;
}
p=first;real=first;
p=p->next;
while(p)
{
if(strcmp(p—〉data。no,no)==0&&strcmp(p—〉data。name,name)==0)
{
//printf(”仓库中已有该货物%d件\n”,p—〉data。count);
p—〉data。count=p—〉data.count+count;
printf(”添加成功!仓库中现有该货物%d件\n是否继续存货?(y/n):”,p—〉data.count);
yn=Yn();
if(yn=='y’||yn=='Y’) return 1;
if(yn==’n'||yn==’N') return 0;
}
if(strcmp(p-〉data。no,no)==0&&strcmp(p—〉data.name,name)!=0)
{
printf("该货物的名称输入有误,应为 %s\n请重新输入(y)或取消存货(n): ”,p—〉data。name);
yn=Yn();
if(yn==’y’||yn==’Y’) return 1;
if(yn==’n’||yn=='N’) return 0;
}
if(strcmp(p—〉data.no,no)!=0&&strcmp(p-〉data。name,name)==0)
{
printf(”该货物的编号输入有误,应为 %s\n请重新输入(y)或取消存货(n): ",p->data.no);
yn=Yn();
if(yn==’y’||yn=='Y’) return 1;
if(yn==’n'||yn==’N') return 0;
}
real=p;
p=p—〉next;
}
if(p==NULL)
{
Node *s=new Node;
strcpy(s-〉data.no,no);
strcpy(s—>data.name,name);
s-〉data。count=count;
s-〉next=NULL;
real->next=s;
real=s;
printf(”添加成功!仓库中现有该货物%d件\n是否继续存货?(y/n):”,real-〉data。count);
yn=Yn();
if(yn==’y’||yn==’Y’) return 1;
if(yn==’n’||yn==’N’) return 0;
}
return 0;
}
Node * Link::Search()
{
char ab;
char no[10],name[30];
int f;
p=first;
printf(”==================\n");
printf(” a. 按货物编号查询 \n”);
printf(” b。 按货物名称查询 \n”);
printf(”==================\n”);
printf(” 请选择(a/b): ");
f=1;
while(f==1)
{
cin〉〉ab;
if(ab=='a’||ab==’A’||ab==’b'||ab=='B’)
{
f=0;
if(ab=='a’||ab=='A')
{
printf(”\n请输入货物编号(10个字符内):\n");
strcpy(no,No());
while(p&&strcmp(p—〉data.no,no)!=0)
p=p—>next;
}
if(ab==’b'||ab==’B’)
{
printf("\n请输入货物名称(30个字符内):”);
cin〉〉name;
while(p&&strcmp(p-〉data。name,name)!=0)
p=p—〉next;
}
}
else
{
f=1;
printf("输入有误,请重新输入(a/b):");
}
}
return p;
}
void Link::Delete()
{
Node *q,*p;
int count,t;
char yn;
p=Search();
if(p==NULL)
{
printf(”仓库中没有该货物!\n”);
}
else
{
printf(”\n仓库中有该货物 %d件。”,p—〉data.count);
int flag=1;
while(flag==1)
{
printf(”\n请输入要取出的货物数量(整数):”);
t=1;
while(t==1)
{
cin〉〉count;
if(count〈0)
{
t=1;
printf(”取货数量不能为负数,请重新输入取货数量(整数):");
}
else
t=0;
}
if(count〉p—〉data。count)
{
printf(”\n输入的取货数量超过库存,是否要重新输入取货数量?(y/n):");
yn=Yn();
if(yn=='y’||yn==’Y') flag=1;
if(yn==’n’||yn==’N’) flag=0;
}
else
{
flag=0;
if(count〈p—〉data。count)
{
p—>data.count=p—〉data。count-count;
Fprintf();//修改文件里的数据。
printf(”\n取货成功!仓库中还有该货物%d件\n”,p—〉data。count);
printf(”\n是否继续取出该货物?(y/n):”);
yn=Yn();
if(yn==’y'||yn=='Y’)
flag=1;
if(yn==’n’||yn==’N')
flag=0;
}
else
{
q=first;
while(q!=NULL&&q—>next!=p)
q=q->next;
q-〉next=p-〉next;
delete p;
Fprintf();//将单链表里的数据写入文件。
printf(”\n取货成功!该货物已被全部取出!\n”);
}
}
}
}
}
void Link::show()
{
if(first—〉next==NULL)
printf(”仓库内没有货物!");
else
{
printf(” 货物编号货物名称货物数量 \n");
printf(”————--—-———---————------—-———————-——-—---—-—-——————-——----————-————---——--——-\n”);
p=first—>next;
while(p)
{
printf(”%15s%23s%23d\n”,p—〉data.no,p—〉data。name,p—>data.count);
p=p—〉next;
printf("—————————————-—---—---—--——-——————--———-—-——--—————---—-—————-——-——-—————————\n”);
}
}
}
char Link::Yn()
{
int f=1;
char yn;
while(f==1)
{
cin〉>yn;
if(yn==’y’||yn==’Y’||yn==’n'||yn=='N')
{
f=0;
return yn;
}
else
{
f=1;
printf(”输入有误,请重新输入(y/n):”);
}
}
}
char * Link::No()
{
int t=1,i;
char *no=NULL,no1[10];
while(t)
{
t=0;
cin>>no1;
no=no1;
for(i=0;no[i];i++)
{
if(no[i]〈’0’||no[i]〉’9’)
{
t=1;
printf(”货物编号只能由0-9的字符组成,请重新输入货物编号(10个字符内):”);
break;
}
}
}
return no1;
}
void Link::Fprintf()
{
FILE *fp=NULL;
fp=fopen("d:\\file01.txt","w”);
p=first—〉next;
while(p!=NULL)
{
fprintf(fp,"%10s%30s%10d\n”,p->data。no,p-〉data.name,p—〉data。count);
p=p-〉next;
}
fclose(fp);
}
void Link::Fscanf()
{
FILE *fp=NULL;
p=first;
Node *s;
fp=fopen("d:\\file01.txt”,"r");
if(fp==NULL)
{
cout〈〈"不能打开文件!”〈<endl;
exit(0);
}
while(feof(fp)==0)
{
s=new Node;
fscanf(fp,”%s%s%d\n”,s—>data。no,s—〉data.name,&s—〉data。count);
if(s—〉data。count>0)
{
p-〉next=s;
p=s;
}
}
p—>next=NULL;
fclose(fp);
}
展开阅读全文