按照你题意,代码如下:(你提问题没有用编程模板,我这里代码只能直接贴,原格式都没了,你只能自己排版了 。)
(初始化数据的那段输入,只为演示,不要可以删除!)。
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <conio.h>
#include <windows.h>
typedef struct stock
{
int id
char name[10]
int stNum
struct stock *next
}STK
void addByName(STK **stkHead,STK **stkTail,STK *stkNew,char *name)//向指定名称商品后添加节点,不存在添加在表头
void meError(void *p)//内存申请失败
int add2Tail(STK **stkHead,STK **stkTail,STK *stkNew)//向链表尾部添加新节点, 成功返回1,失败返回0
int add2Head(STK **stkHead,STK **stkTail,STK *stkNew)//向链表头部添加新节点, 成功返回1,失败返回0
STK *newSTK()//创建新节点,新建节点
STK *initSTK()//初始化链表
void printSTK(STK *stkHead)
void tjAll(STK *stkHead)//统计总库存数量
int main()
{
int i
char name[10]
STK *stkHead=initSTK(),*stkTail=NULL
//----------为了测试,我在下面这段初始了3个节点,不需要可以删除
i=3
printf("请输入3个节点作为初始测试数据(不需要可以删除该段代码):\n")
while(i--)
if(!add2Tail(&stkHead,&stkTail,newSTK()))
printf("添加节点失败,请重新输入!\n"),i++
while(1)
{
system("cls")
printf("1、显示当前所有商品信息\n")
printf("2、统计商品总库存\n")
printf("3、向指定商品名后添加商品(名称不存在,将插入表头)\n")
scanf("%d",&i)
switch(i)
{
case 1:system("cls")printSTK(stkHead)break
case 2:system("cls")tjAll(stkHead)break
case 3:system("cls")printf("请输入要插入位置商品的名称:"),scanf("%s",name)addByName(&stkHead,&stkTail,newSTK(),name)break
}
printf("................按任意键继续!\n")
getch()
}
return 0
}
STK *initSTK()//初始化链表
{
STK *stkHead=(STK *)malloc(sizeof(STK))
meError(stkHead)
stkHead->next=NULL
return stkHead
}
void addByName(STK **stkHead,STK **stkTail,STK *stkNew,char *name)//向指定名称商品后添加节点,不存在添加在表头
{
int flag=0
STK *stkh=*stkHead
while(stkh->next)
{
if(strcmp(stkh->next->name,name)==0)
{
stkNew->next=stkh->next->next
stkh->next->next=stkNew
flag=1
break
}
stkh=stkh->next
}
if(flag)
printf("新的商品已成功添加到商品%s后面!\n",name)
else
{
add2Head(stkHead,stkTail,stkNew)
printf("%s不存在!新的商品已添加到表头!\n",name)
}
}
void printSTK(STK *stkHead)
{
printf("当前库存情况:\n")
while(stkHead->next)
{
printf("商品编号:%04d,商品名称:%9s,商品库存:%d\n",stkHead->next->id,stkHead->next->name,stkHead->next->stNum)
stkHead=stkHead->next
}
}
void tjAll(STK *stkHead)//统计总库存数量
{
int cnt=0,sum=0
while(stkHead->next)
{
cnt++
sum+=stkHead->next->stNum
stkHead=stkHead->next
}
printf("当前库存共%d种商品,总计库存数量%d\n",cnt,sum)
}
STK *newSTK()//创建新节点,新建节点
{
static int stockID=1//商品ID唯一,每次使用,自增
STK *stkNew=(STK *)malloc(sizeof(STK))
meError(stkNew)
stkNew->next=NULL
stkNew->id=stockID++
printf("请输入商品名称:")
scanf("%s",stkNew->name)
printf("请输入商品库存:")
scanf("%d",&stkNew->stNum)
return stkNew
}
int add2Tail(STK **stkHead,STK **stkTail,STK *stkNew)//向链表尾部添加新节点, 成功返回1,失败返回0
{
if(!(*stkHead))
return 0
if(!((*stkHead)->next))
add2Head(stkHead,stkTail,stkNew)
else
(*stkTail)->next=stkNew
*stkTail=stkNew
return 1
}
int add2Head(STK **stkHead,STK **stkTail,STK *stkNew)//向链表头部添加新节点, 成功返回1,失败返回0
{
if(!(*stkHead))
return 0
if(!((*stkHead)->next))
(*stkTail)=stkNew
stkNew->next=(*stkHead)->next
(*stkHead)->next=stkNew
return 1
}
void meError(void *p)//内存申请失败
{
if(p==NULL)
{
printf("\n异常:内存申请失败!回车结束程序!\n")
while(getch()!='\r')
exit(0)
}
}
我有一个学生管理系统程序,你可以把学生量改成库存量。希望对你能有帮助。http://zhidao.baidu.com/question/2202293700663164948.html?oldq=1
需求表D2单元格写公式:=IF(ISERROR(VLOOKUP(B2,库存表!A:B,2,FALSE)),SUMIF($B$2:B2,B2,$C$2:C2)-VLOOKUP(B2,库存表!A:B,2,FALSE),IF(VLOOKUP(B2,库存表!A:B,2,FALSE)-SUMIF($B$2:B2,B2,$C$2:C2)<0,SUMIF($B$2:B2,B2,$C$2:C2)-VLOOKUP(B2,库存表!A:B,2,FALSE),"OK"))
注意:缺少数是累计的,例如某物品在第一次缺少是2,第二次需求数量是5,那么缺少数量就是7。如果你不要累计的话,就使用下面的公式:
=IF(ISERROR(VLOOKUP(B2,库存表!A:B,2,FALSE)),min(c2,SUMIF($B$2:B2,B2,$C$2:C2)-VLOOKUP(B2,库存表!A:B,2,FALSE)),IF(VLOOKUP(B2,库存表!A:B,2,FALSE)-SUMIF($B$2:B2,B2,$C$2:C2)<0,min(c2,SUMIF($B$2:B2,B2,$C$2:C2)-VLOOKUP(B2,库存表!A:B,2,FALSE)),"OK"))
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)