发布网友 发布时间:2023-11-04 02:43
共1个回答
热心网友 时间:2024-07-31 03:22
按照你题意,代码如下:(你提问题没有用编程模板,我这里代码只能直接贴,原格式都没了,你只能自己排版了 。)
(初始化数据的那段输入,只为演示,不要可以删除!)。
#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);
}
}