ORIGIN-JOKER 2023-02-18 11:43 采纳率: 88.9%
浏览 23
已结题

C语言实训的两个问题

我一共有两个问题关于我C语言的结课代码
1、函数无法调用的问题(已解决)但是不知道原理,希望帮忙解释一下,就是我写的函数声明是 *jd cz_bh();,当我要调用的时候(case '3'的时候调用了)把这段代码原封不动写上去函数无法运行,直接跳过了这个函数,但是当我把jd*删除,只保留cz_bh()后函数又可以正常调用了,我不知道是为什么希望有人帮我解释一下

2、查找功能传回去的值不是我需要的值,我定义了一个cz_bh()函数来以此通过编号查找到我存储的零部件信息,当我往cz_bh()中存储信息,如图是我已经输入的数据

img

我要查找,往cz_bh()输入1,结果是编号2的信息,不知道是为什么

img

于是我开始调试,如图是第二次循环找到了编号为2零部件

img

img


然后程序返回了p,截至到这里都没有问题,如图,但是返回后的值有问题,p本应该返回编号为1的值,但是此时返回了编号为2的值

img

接下来输入什么返回的都是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;
        }         
    }

}


  • 写回答

1条回答 默认 最新

  • 快乐鹦鹉 2023-02-18 11:55
    关注

    写成jd* cz_bh(),这是函数申明,当然啥也不会执行
    写成ch_bh(),这是函数调用,在这里调用ch_bh函数,当然会执行啊
    =======
    86行你只是调用了ch_bh()函数,但你没有接收这个函数的返回值啊,改成p = ch_bh();这样p才是函数查找到的节点指针

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 2月26日
  • 已采纳回答 2月18日
  • 创建了问题 2月18日

悬赏问题

  • ¥15 C++扑克牌游戏的编程
  • ¥15 有人能看一下我宿舍管理系统的报修功能该怎么改啊?链表那里总是越界
  • ¥15 cs loadimage运行不了,easyx也下了,没有用
  • ¥15 r包runway详细安装教程
  • ¥15 Html中读取Json文件中数据并制作表格
  • ¥15 谁有RH342练习环境
  • ¥15 STM32F407 DMA中断问题
  • ¥15 uniapp连接阿里云无法发布消息和订阅
  • ¥25 麦当劳点餐系统代码纠错
  • ¥15 轮班监督委员会问题。