www.pudn.com > DOUBLE_LINK.rar > link.cpp
#include#include #include #include #include #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 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 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 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("选择无效!"); }