#include <stdlib.h>
#include <malloc.h>
#include <stdio.h>
#include <string.h>
#include <iostream.h>
#define max 20
#define NULL 0
#define exit 0
#define ok 1
#define error 0
typedef struct dnode // 定义双向链表结构体
{
int number; //货物编号
char name[max]; //货物名称
int counter; //货物数量
struct dnode *prior,*next; //定义两指针,分别指向其前驱和后继
}dnode;
dnode *creatlink(dnode *&p,int number,char name[],int counter) //创建一个空的头结点
{
p=(dnode *)malloc(sizeof(dnode)); //分配空间
p->number=999999999;
strcpy(p->name,name); //复制字符数组
p->counter=counter;
p->prior=NULL;
p->next=NULL;
return p; //返回头指针
}
dnode *insert(dnode *&p,int number,char name[],int counter) //在链表中插入新结点,货物入库
{
dnode *tmp,*q;
q=p;
while(q->next!=NULL&&number<q->number) //q移动到某一结点,使要插入结点编号不小于q当前所指结点编号,并且q未指向最后一个结点
{
q=q->next; //q后移一个位置
}
tmp=(dnode *)malloc(sizeof(dnode)); //分配空间
tmp->number=number;
strcpy(tmp->name,name);
tmp->counter=counter;
if(q->number==number) //插入结点编号与q当前所指结点编号相同,只让货物数量增加
q->counter=counter+q->counter;
else if(q->next==NULL&&number<q->number) //插入结点编号比q当前所指结点编号小,且q所指结点为链表末结点
{
q->next=tmp;
tmp->prior=q;
tmp->next=NULL;
}
else //插入结点编号比q当前所指结点编号大
{
tmp->prior=q->prior;
q->prior->next=tmp;
tmp->next=q;
q->prior=tmp;
}
return p; //返回头指针
}
dnode *del(dnode *&p,int number,char name[],int counter) //删除结点,货物出库
{
int s;
dnode *q;
q=p;
if(q->next==NULL) //链表为空,仓库中没有货物
printf("注意:仓库中没有可用物品!请赶快进货!\n");
else
{
while(q->next!=NULL&&number<q->number) //q移动到某一结点,使要删除结点编号不小于q当前所指结点编号,并且q未指向最后一个结点
{
q=q->next;
}
if(number==q->number)
{
s=q->counter-counter; //出货后仓库中货物数量
if(s>0)
{
q->counter=s; //出货后尚有剩余
}
else if(s<0) //要出货数量大于仓库中储存数量,不执行操作
{
printf("注意:仓库中货源不足,请赶快进货!\n");
}
else //该种货物完全出仓
{
if(q->next!=NULL) //q所指结点为链表中间结点
{
q->prior->next=q->next;
q->next->prior=q->prior;
}
else
q->prior->next=NULL; //q所指结点为链表最后一个结点
}
}
else //没查找到要出库货物
printf("注意:仓库中没有该种货物!请赶快补货!\n");
}
return p; //返回头指针
}
void NumberSearch(dnode *p,int number) //按编号查找货物
{
dnode *q;
q=p;
while(q->number!=number&&q->next!=NULL) //q移动到某一结点,使要查找结点编号不小于q当前所指结点编号,并且q未指向最后一个结点
{
q=q->next;
}
if(q->number==number) //找到要查找的货物
printf("你所查找的货物信息如下:\n 货号:%d\n 名称:%s\n 数量:%d\n",q->number,q->name,q->counter);
else //没找到要查找的货物
printf("注意:仓库中没有该种货物!请赶快补货!\n");
}
void NameSearch(dnode *p,char name[]) //按货物名称查找货物
{
dnode *q;
q=p;
while((strcmp(name,q->name)!=0?1:0)&&q->next!=NULL) //q向后移动直到所指结点名称与要查找结点名称相同,直到q指向最后一个结点
{
q=q->next;
}
if(strcmp(name,q->name)==0) //找到要查找的货物
printf("你所查找的货物信息如下:\n 货号:%d\n 名称:%s\n 数量:%d\n",q->number,q->name,q->counter);
else //没找到要查找的货物
printf("注意:仓库中没有该种货物!请赶快补货!\n");
}
void print(dnode *p) //输出链表所有结点
{
int i=0;
dnode *tmp;
tmp=p;
if(tmp->next==NULL) //链表为空
printf("注意:仓库中没有可用物品!请赶快进货!\n");
else //逐个输出结点
{
for(;tmp->next!=NULL;tmp=tmp->next)
{
i++;
printf("\n物品%d:\n 货号:%d\n 名称:%s\n 数量:%d\n\n",i,tmp->next->number,tmp->next->name,tmp->next->counter);
}
}
}
void main()
{
int c,t,Number,Counter;
char ch,y,n,Name[max];
dnode *head;
head=creatlink(head,Number,Name,Counter);
printf("***********************操作菜单*************************\n");
printf("* 进入操作————y *\n");
printf("* 退出操作————n *\n");
printf("* 货物入库————1 *\n");
printf("* 货物出库————2 *\n");
printf("* 仓库清单————3 *\n");
printf("* 指定货物查询——4 *\n");
printf("********************************************************\n");
printf("你选择的操作是:");
scanf("%c",&ch);
if(ch=='y')
{
do
{
printf("你选择的操作是:");
scanf("%d",&c);
if(c==1)
{
printf("输入入库货物编号、名称及数量:");
scanf("%d %s %d",&Number,&Name,&Counter);
insert(head,Number,Name,Counter);
}
else if(c==2)
{
printf("输入出库货物编号、名称及数量:");
scanf("%d %s %d",&Number,&Name,&Counter);
del(head,Number,Name,Counter);
}
else if(c==3)
{
printf("\n现在仓库中库存物品清单如下\n");
print(head);
}
else if(c==4)
{
printf("请选择按何种方式查找货物:按货号查找请按1,按名称查找请按2。");
scanf("%d",&t);
if(t==1)
{
printf("请输入要查找货物的货号:");
scanf("%d",&Number);
NumberSearch(head,Number);
}
else if(t==2)
{
printf("请输入要查找货物的名字:");
scanf("%s",Name);
NameSearch(head,Name);
}
else
printf("选择无效!\n");
}
else
printf("选择无效!\n");
}while(1);
}
else if(ch=='n')
exit;
else
printf("选择无效!");
}