数据结构课程设计——仓库管理系统源程序(9页).doc
-数据结构课程设计仓库管理系统源程序-第 9 页#include<iostream>using namespace std;typedef structchar no10;char name30;int count;DataType;struct NodeDataType data;Node *next;class Linkpublic: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("nnnnn"); printf("nttt*");printf("nttt* XXX仓库管理系统*"); printf("nttt* 1- 存储货物 *"); printf("nttt* 2- 查询货物信息 *"); printf("nttt* 3- 取出货物 *"); printf("nttt* 4- 显示仓库内所有货物信息 *"); printf("nttt* 0- 退出仓库管理系统 *"); printf("nttt*"); printf("nttt请选择菜单号(0-4):");f=1;while(f=1)cin>>n;if(n<'0'|n>'4')printf("输入有误,请重新输入(0-4):");f=1;elsef=0;printf("nn");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%8dn",p->data.no,p->data.name,p->data.count);printf("-n");elseprintf("仓库中没有该货物!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 no10,name30;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,请重新");elset=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("该货物的名称输入有误,应为 %sn请重新输入(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("该货物的编号输入有误,应为 %sn请重新输入(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 no10,name30;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;elsef=1;printf("输入有误,请重新输入(a/b):");return p;void Link:Delete()Node *q,*p;int count,t;char yn;p=Search();if(p=NULL)printf("仓库中没有该货物!n");elseprintf("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("取货数量不能为负数,请重新输入取货数量(整数):");elset=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;elseflag=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;elseq=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("仓库内没有货物!");elseprintf(" 货物编号 货物名称 货物数量 n"); printf("-n");p=first->next;while(p)printf("%15s%23s%23dn",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;elsef=1;printf("输入有误,请重新输入(y/n):");char * Link:No()int t=1,i;char *no=NULL,no110;while(t)t=0;cin>>no1;no=no1;for(i=0;noi;i+)if(noi<'0'|noi>'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%10dn",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%dn",s->data.no,s->data.name,&s->data.count);if(s->data.count>0)p->next=s;p=s;p->next=NULL;fclose(fp);