仓库管理。这个结构体然后那个思路是什么?调用没懂。。
#include<stdio.h>#include<iostream>
using namespace std;
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
#define max 32
int ifempty=0;//标志,判断链表是无否为空
struct dlnode /* 定义双向链表结构体 */
{
char name[max]; //货物名称
int number; //货物编号
int price; //价格
int counter; //货物数量
dlnode *prior, *next; // 定义两指针,分别指向其前驱和后继
};
dlnode * create(dlnode *L);
dlnode *input(dlnode *L);
dlnode *output(dlnode *L);
dlnode * outnum(dlnode *L);
dlnode * outname(dlnode *L);
dlnode *current(dlnode *L);
void search(dlnode *L);
void print(dlnode *L);
void searchnum(dlnode *L);
void searchname(dlnode *L);
void display(dlnode *L) ;
void shownotenough(dlnode *L);
void main()
{
int x;
dlnode *L;
if(!(L=(dlnode *)malloc(sizeof(dlnode)))) //分配空间
{
cout<<endl;
exit(1);
}
create(L);///调用函数,创建头节点
while(1)
{////////////////////////主菜单///////////////////////////
cout<<" ***********************************\n";
cout<<" 1. 货物出库和入库\n";
cout<<" 2. 查找货物表\n";
cout<<" 3. 显示仓库货物表\n";
cout<<" 4. 显示库存不足一定值的货物信息\n";
cout<<" 5. 输出到文件\n";
cout<<" 0. 退出\n";
cout<<" ************************************\n";
cout<<" 选择0--4:";
cin>>x;
switch(x)
{
case 1:current(L);break;//调用入库出库函数
case 2:search(L);break;//调用查找函数
case 3:display(L);break;//调用显示输出函数
case 4:shownotenough(L);break;//调用显示不足一定值的函数
case 5:print(L);break;//调用打印函数
case 0:cout<<endl;cout<<"--------------bye bye!-----------------"<<endl;
getchar();exit(0);//退出程序
default:printf("\n Enter erreor!please input 0--5!");
getchar();
cout<<"=======================请输入回车返回主菜单==================="<<endl;getchar();
}
}
}
dlnode *create(dlnode *L)//创建链表头节点
{
ifempty=0;
///////初始化头节点的值////////
L->next=NULL;L->prior=NULL;
L->number=L->price=L->counter=0;
strcpy(L->name," ");
return L;
}
void search(dlnode *L) ///查找的主要菜单
{
int y;
if(ifempty==0)
{
cout<<"没有输入货物!\n";
getchar();
cout<<"=======================请按回车继续操作==================="<<endl;getchar();
return ;
}
else
{
while(1)
{
cout<<"=====================\n";
cout<<"1.按编号查询\n";
cout<<"2.按货物名称查询\n";
cout<<"0.返回主菜单\n";
cout<<"====================\n";
cout<<"选择0--2:";
cin>>y;
switch(y)
{
case 1:searchnum(L);break;//调用按编号查找的函数
case 2:searchname(L);break;//调用按名称查找的函数
case 0:return;//返回
default:cout<<"enter error!Please input 0--2!\n\n";
getchar();
cout<<"=======================请输入回车返回主菜单==================="<<endl;getchar();cout<<endl<<endl;
}
}
}
}
dlnode * current(dlnode *L)//货物出库入库函数
{
int y;
while(1)
{
cout<<"========================\n";
cout<<" 1.货物入库\n";
cout<<" 2.货物出库\n";
cout<<" 0.返回主菜单\n";
cout<<"========================\n";
cout<<" 选择0--2:";
cin>>y;
switch(y)
{
case 1:input(L);break;//调用入库函数
case 2:output(L);break;//调用出库函数
case 0:return(L);//返回上一层
default:cout<<"enter error!Please input 0--2!";
getchar();
cout<<"=======================请按回车继续操作================="<<endl;getchar();
cout<<endl<<endl;
}
}
}
dlnode *input(dlnode *L)//定义入库函数
{
dlnode *in,*head;
head=in=(dlnode *)malloc(sizeof(dlnode));//分配空间
head=L;
cout<<"\n请输入货物数据:\n";
cout<<"编号:";cin>>in->number;
cout<<"名称:";cin>>in->name;
cout<<"价格:";cin>>in->price;
cout<<"数量:";cin>>in->counter;
if(L->next==NULL) //如果只有头节点,
{ //把刚输入的in节点
L->next=in; //跟在头节点后面
L->prior=in; //
in->next=L; //
in->prior=L; //
ifempty++; //ifempty加1
}
else
{
while((L=L->next)!=head)//如果当前L的下一个节点不是头节点
{
if(L->number<in->number)//如果输入的数大于L->number,则插到L的前面
{
in->next=L;
in->prior=L->prior;
L->prior->next=in;
L->prior=in;
ifempty++; //ifempty加1
return(head);
}
}
//输入的编号比其它编号都小,则插到最后个节点,并首尾相连
head->prior->next=in;
in->prior=head->prior;
head->prior=in;
in->next=head;
ifempty++; //ifempty加1
}
return head;
}
dlnode *output(dlnode *L)//出库的函数
{
int y;
dlnode *head=L;
if(ifempty==0)//检测是否有货物输入
{
cout<<"没有货物输入系统\n";
getchar();
cout<<"=======================请按回车继续操作================="<<endl;getchar();
return(head);
}
while(1)
{
cout<<"=============\n";
cout<<"1.按编号出库\n";
cout<<"2.按名称出库\n";
cout<<"0.返回上一层\n";
cout<<"==============\n";
cout<<"选择0--2:";cin>>y;
switch(y)
{
case 1:outnum(L);break;//调用按编号出库函数
case 2:outname(L);break;//调用按名称出库函数
case 0:return(L);
default:cout<<"enter error!Please input 0--2!";
getchar();
cout<<"=======================请按回车继续操作================="<<endl;getchar();cout<<endl<<endl;
}
}
}
dlnode *outnum(dlnode *L)//按编号出库函数
{
int num;
dlnode *head=L;
cout<<"请输入出库货物的编号:";
cin>>num;
while((L=L->next)!=head)
{//如果找到就删除节点
if(L->number==num)
{
L->prior->next=L->next;
L->next->prior=L->prior;
ifempty--; //ifempty减1
cout<<"编号为"<<num<<"的货物成功出库\n";
getchar();
cout<<"=======================请按回车继续操作==================="<<endl;getchar();
return head;
}
}
cout<<"没有此编号的货物,请查看是否还有货物。\n\n";
getchar();
cout<<"=======================请按回车继续操作================="<<endl;getchar();
return (head);
}
dlnode *outname(dlnode *L)//按名称出库函数
{
char na[32];
dlnode *head=L;
cout<<"请输入出库货物的名称:";
cin>>na;
while((L=L->next)!=head)
{//如果找到就删除节点
if(strcmp(L->name,na)==0)
{
L->prior->next=L->next;
L->next->prior=L->prior;
ifempty--; //ifempty减1
cout<<"名称为%s的货物成功出库",na;
getchar();
cout<<"=======================请按回车继续操作================="<<endl;getchar();
return (head);
}
}
cout<<"没有此名称的货物,请查看是否还有货物。\n\n";
getchar();getchar();
return(head);
}
void searchnum(dlnode *L)///按编号查找的函数
{
int num,flag=0;//flag为是否找到的标志
dlnode *head=L;
if(ifempty==0)
{
cout<<"没有货物被输入\n";
getchar();
cout<<"=======================请输入回车返回主菜单==================="<<endl;getchar();
return;
}
cout<<"输入你要查找的货物编号:\n";
cin>>num;
while((L=L->next)!=head)
{
if(L->number==num)
{ flag=1;//flag为1时表示找到
cout<<"找到指定编号货物 \n";
cout<<"\n编号:"<<L->number<<endl;
cout<<"名称:"<<L->name<<endl ;
cout<<"价格"<<L->price<<endl;
cout<<"数量:"<<L->counter<<endl<<endl;
}
}
if(flag==0)//flag为0时表示没有找到
cout<<"没有找到指定编号货物,请查看是否还有货物。\n";
getchar();
cout<<"=======================请按回车继续操作================="<<endl;getchar();
}
void searchname(dlnode *L)//按名称查找的函数
{
int flag=0;//flag为是否找到的标志
char na[32];
dlnode *head=L;
if(ifempty==0)
{
cout<<"没有货物被输入\n";
getchar();
cout<<"=======================请按回车继续操作==================="<<endl;getchar();
return;
}
printf("输入你要查找的货物名称\n");
cin>>na;
while((L=L->next)!=head)
{
if(strcmp(L->name,na)==0)
{ flag=1;//flag为1时表示找到
cout<<"找到指定名称货物 \n";
cout<<"\n编号:"<<L->number<<endl;
cout<<"名称:"<<L->name<<endl ;
cout<<"价格"<<L->price<<endl;
cout<<"数量:"<<L->counter<<endl<<endl;
}
}
if(flag==0)//flag为0时表示没有找到
cout<<"没有找到指定编号货物,请查看是否还有货物。\n\n";
getchar();
cout<<"=======================请按回车继续操作================="<<endl;getchar();
}
void display(dlnode *L)//显示货物清单
{
dlnode *head=L;
if(ifempty==0)
{
cout<<"没有货物可显示\n";
getchar();getchar();
return;
}
L=L->next;
do
{
cout<<"\n编号:"<<L->number<<endl;
cout<<"名称:"<<L->name<<endl ;
cout<<"价格"<<L->price<<endl;
cout<<"数量:"<<L->counter<<endl<<endl;
}while((L=L->next)!=head);
getchar();
cout<<"=======================请按回车继续操作================="<<endl;getchar();
}
void shownotenough(dlnode *L)
{
int flag=0;
dlnode *head=L;
if(ifempty==0)
{
cout<<"没有货物被输入\n";
getchar();
cout<<"=======================请输入回车返回主菜单==================="<<endl;getchar();
return;
}
int toShow;
cout<<"请输入货物数量:";
cin>>toShow;
while((L=L->next)!=head)
{
if(toShow>L->counter)
{
cout<<"货物数量不足"<<toShow<<"的货物信息:"<<endl;
cout<<"\n编号:"<<L->number<<endl;
cout<<"名称:"<<L->name<<endl ;
cout<<"价格"<<L->price<<endl;
cout<<"数量:"<<L->counter<<endl<<endl;
flag=1;
}
}
if(flag==0)
cout<<"没有数量不足"<<toShow<<"的货物!"<<endl;
getchar();
cout<<"=======================请输入回车返回主菜单==================="<<endl; getchar();
}
void print(dlnode *L)
{
dlnode *head=L;
L=L->next;
char filename[max];
FILE *out;
if(ifempty==0)
{
cout<<"没有货物可输出\n";
getchar();getchar();
return;
}
cout<<"请输入文件名称:";
cin>>filename;
if((out=fopen(filename,"w"))==NULL)
{
cin>>"打开文件失败!\n";
getchar();
cout<<"=======================请按回车继续操作================="<<endl;getchar();
return;
}
do{
fprintf(out,"编号:%d\n名称:%s\n数量:%d\n\n",L->number,L->name,L->counter);
}while((L=L->next)!=head);
cout<<"输出成功\n";getchar();
cout<<"=======================请按回车继续操作================="<<endl;getchar();
fclose(out);
}