我一共有两个问题关于我C语言的结课代码
1、函数无法调用的问题(已解决)但是不知道原理,希望帮忙解释一下,就是我写的函数声明是 *jd cz_bh();,当我要调用的时候(case '3'的时候调用了)把这段代码原封不动写上去函数无法运行,直接跳过了这个函数,但是当我把jd*删除,只保留cz_bh()后函数又可以正常调用了,我不知道是为什么希望有人帮我解释一下
2、查找功能传回去的值不是我需要的值,我定义了一个cz_bh()函数来以此通过编号查找到我存储的零部件信息,当我往cz_bh()中存储信息,如图是我已经输入的数据
我要查找,往cz_bh()输入1,结果是编号2的信息,不知道是为什么
于是我开始调试,如图是第二次循环找到了编号为2零部件
然后程序返回了p,截至到这里都没有问题,如图,但是返回后的值有问题,p本应该返回编号为1的值,但是此时返回了编号为2的值
接下来输入什么返回的都是2的值,不知道为什么,我把我的源代码发在底下了,希望有巨佬能忙里抽闲帮我看一下,我必感激不尽
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
//定义采购信息
typedef struct _car
{
char bh[20]; //编号
char mc[10]; //名称
char rq[20]; //日期
char cgy[20];//采购员
int num; //数量
double dj; //单价
char dw[5]; //单位
}car;
//结点
typedef struct _jd
{
car lj; //零件
struct _jd* pnext;//指向下一个结点的指针
}jd;
//头结点
jd *g_pHead = NULL;
//函数:菜单
void menu();
//函数:录入信息
void lr();
//函数:打印信息
void dy();
//函数:通过编号查找零部件
jd* cz_bh();
//函数:通过名称查找零部件
jd* cz_mc();
//函数:修改零部件信息
void xg();
//函数:删除零部件是头结点的信息
void t_sc();
//函数:删除零部件不是头结点的信息
void ft_sc();
int main()
{
while(1)
{
jd* p;
p = g_pHead;
system("cls"); //清屏
//打开菜单
menu();
//输入选择
printf("请输入你的选择(直接点击数字,不用进行回车)\n");
//从键盘中接收一个字符来直接操作
char ch = getch();
switch(ch)
{
case '1':
printf("接下来是采购信息的录入\n");
lr();
break;
case '2':
printf("接下来是打印所有零部件采购信息\n");
dy();
break;
case '3':
{
printf("接下来是通过编号查找零部件\n");
cz_bh();
if(p != NULL)
{
printf("*编号:%s\t*名称:%s\t*日期:%s\t*采购员:%s\t*数量%d\t*单价:%.2lf\t*单位:%s*\n",p->lj.bh,p->lj.mc,p->lj.rq,p->lj.cgy,p->lj.num,p->lj.dj,p->lj.dw);
}
else
{
printf("查找失败,未检查到所输入的编号,请您重新检查输入\n");
}
system("pause");
break;
}
case '4':
{
printf("接下来是通过名称查找零部件\n");
cz_mc();
if(p != NULL)
{
printf("*编号:%s\t*名称:%s\t*日期:%s\t*采购员:%s\t*数量%d\t*单价:%.2lf\t*单位:%s*\n",p->lj.bh,p->lj.mc,p->lj.rq,p->lj.cgy,p->lj.num,p->lj.dj,p->lj.dw);
}
else if(p == NULL)
{
printf("查找失败,未检查到所输入的名称,请您重新检查输入");
}
system("pause");
break;
}
case '5':
printf("接下来是给定采购编号,修改采购信息\n");
xg();
break;
case '6':
{
int i;
printf("接下来是给定采购编号,删除采购信息\n");
printf("请输入需要删除的零部件的编号是否是您最后输入的零部件(是或只有一个零部件按1,不是按0):\n");
scanf("%d",&i);
if(i==1)
{
t_sc();
}
else if(i==0)
{
ft_sc();
}
else
{
printf("对不起,您的输入有误,请重新检查输入\n");
system("pause");
}
break;
}
case'7':
printf("感谢您的下次使用,再见");
return 0;
break;
default:
printf("您当前输入有误,请您确认您的操作再重试\n");
system("pause");
break;
}
}
return 0;
}
void menu()
{
printf("******汽车零部件采购程序******\n");
printf("\t(1)能从键盘输入采购信息。");
printf("\n\t(2)打印所有零部件信息。");
printf("\n\t(3)指定采购编号,显示采购的零部件信息。");
printf("\n\t(4)指定零部件名称,显示该零部件的所有采购信息。");
printf("\n\t(5)给定采购编号,修改采购信息。");
printf("\n\t(6)给定采购编号,删除采购信息。");
printf("\n\t(7)退出程序\n");
}
void lr()
{
//创建一个新结点
jd* pjd=(jd*)malloc(sizeof(jd));
pjd->pnext=NULL;
//头插法
if(g_pHead == NULL) //没有结点,赋予结点
{
g_pHead = pjd;
}
else //有结点
{
pjd->pnext = g_pHead;//新结点的下一个为头结点
g_pHead = pjd; //则头结点为新设的结点
}
printf("请输入编号(例如:1 2 3):\n\t");
scanf("%s",pjd->lj.bh); //编号
printf("请输入零部件名称(例如:xxx):\n\t");
scanf("%s",pjd->lj.mc); //名称
printf("请输入日期(例如:xx):\n\t");
scanf("%s",pjd->lj.rq); //日期
printf("请输入采购员名称(例如:张三):\n\t");
scanf("%s",pjd->lj.cgy);//采购员
printf("请输入采购数量(例如:2):\n\t");
scanf("%d",&pjd->lj.num);//数量
printf("请输入零部件单价(例如:2.00):\n\t");
scanf("%lf",&pjd->lj.dj);//单价
printf("请输入零部件价格单位(例如:SF):\n\t");
scanf("%s",pjd->lj.dw); //单位
printf("零部件信息录入成功!\n");
printf("如果您想继续输入,请在看到请按任意键继续后回到菜单继续按1录入信息\n");
system("pause"); //停顿
return;
}
//*********************
//********
//*************
void dy()
{
printf("******************************************************\n");
printf("*\t 欢迎使用汽车零部件管理系统 *\n");
printf("******************************************************\n");
printf("*编号\t*名称\t*日期\t*采购员\t*数量\t*单价\t*单位*\n");
printf("******************************************************\n") ;
//遍历链表
jd* p =g_pHead; //让p指向头指针
while(p != NULL)//只要结点不为空就让循环往下走
{
printf("*%s\t*%s\t*%s\t*%s\t*%d\t*%.2lf\t*%s*\n",
p->lj.bh,
p->lj.mc,
p->lj.rq,
p->lj.cgy,
p->lj.num,
p->lj.dj,
p->lj.dw);
p=p->pnext; //指向下一个
}
system("pause");
}
jd* cz_bh()
{
char cz_bh[20];
printf("请输入你想查找的零件的编号:\n");
scanf("%s",cz_bh);
jd* p=g_pHead;
while(p!=NULL)
{
if(strcmp(p->lj.bh,cz_bh)==0) //会报警告
{
return p;
}
p = p->pnext;
}
return NULL;
}
jd* cz_mc()
{
char cz_mc[20];
printf("请输入你想查找的零件的名称:\n");
scanf("%s",cz_mc);
jd* p =g_pHead;
while(p!=NULL)
{
if(strcmp(p->lj.mc,cz_mc)==0)
{
return p;
}
p=p->pnext;
}
return NULL;
}
void xg()
{
char xg_bh[20];
printf("请输入需要修改的零部件的采购编号\n");
scanf("%s",xg_bh);
jd* p=g_pHead;
while(p!=NULL)
{
if(strcmp(p->lj.bh,xg_bh)==0) //p->li.bh与xg_bh不能用等号比较
{
printf("请输入修改后的零部件名称:\n");
scanf("%s",p->lj.mc);
printf("修改成功\n");
system("pause");
break;
}
p = p->pnext;
}
if(p == NULL)
{
printf("未能找到此采购编号对应零部件,请检查编号\n");
system("pause");
}
}
void t_sc()
{
jd* p1;
char sc_bh[20];
printf("请输入你所想要删除的零部件的编号:");
scanf("%s",sc_bh);
//如果是头结点
if(strcmp(g_pHead->lj.bh,sc_bh)==0)
{
p1 = g_pHead; //备份头结点
g_pHead = g_pHead->pnext;// 将头结点指向下一个结点
free(p1); //删除就是释放这段内存 ,p1被赋予了头结点,但是头结点已经指向下一个结点
printf("恭喜,删除成功\n");
system("pause");
return;
}
else
{
printf("对不起,删除失败,请检查你输入的编号\n");
system("pause");
return;
}
}
void ft_sc()
{
//如果不是头结点
char sc1_bh[20];
printf("请输入你所想要删除的零部件的编号:");
scanf("%s",sc1_bh);
jd* p = g_pHead;
jd* p2; //p2是备份的
while(p2->pnext != NULL)
{
if(strcmp(p->pnext->lj.bh,sc1_bh)==0)
{
p2 = p->pnext; //备份头结点
p->pnext = p->pnext->pnext;//中间结点(要删除的结点)的上一个结点是头结点,头结点的下一个结点是中间节点的后一个结点 ,把中间结点指向第三个结点
free(p2);
}
if(p->pnext == NULL) //中间结点已删除. NULL会警告,'0'不会 ,char变量和指针变量不能比较
{
printf("恭喜,成功删除\n");
system("pause");
return;
}
p = p->pnext;
if(p->pnext == NULL)//跳出循环,表示零件不存在
{
printf("对不起,删除失败,请检查你输入的编号\n");
system("pause");
return;
}
}
}