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&&numbernumber)		//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&&numbernumber)		//插入结点编号比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&&numbernumber)		//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("选择无效!"); 
}