Yinzhien 2021-07-14 23:58 采纳率: 87.5%
浏览 38
已结题

C语言写的职工管理程序,添加职工信息时运行断开,甚至会强行退出运行,是什么原因?

img

img

添加职工信息模块时运行突然自行停止,甚至自己关闭运行界面,以下是运行结果和代码,求会的详细解析,

//1.增加职工
int addWorker (Node *worker)    
{    char addNum[20],addName[20],addJob[20],adddepartment[20];
    int num=0,i;
    Node *p,*q,*pre,*k;
    q=pre=worker;    //头结点不存储数据 
    k=worker->next;
//    if(q->next !=NULL) 
//    {
//        pre=q;
//        q=q->next; 
//        q->prior=pre;
//    }
    p=(Node *)malloc(sizeof(Node));
    printf("请依次输入数据:\n");  
    printf("工号:\n");
    scanf("%s",p->worker.num);
            while(p!=NULL)
            {    
                if(strcmp(p->worker.num,k->worker.num)==0)
                {
                    num++;
                    if(num==1)
                    {
                        printf("该工号已存在,请重新输入:"); 
                        
                        scanf("%s",p->worker.num);
                        break;
                    } 
                        
                }
                p=p->next;
            }
            
    printf("姓名:\n");
    scanf("%s",p->worker.name);

    printf("入厂年月:\n");
    scanf("%s",p->worker.inday);
    
    printf("职称:\n");
    scanf("%s",p->worker.job);
    
    printf("工作部门:\n");
    scanf("%s",p->worker.department);
    
    printf("工资:\n");
    scanf("%s",p->worker.salary);
 
     
     
    printf("新增职工信息如下:\n\n");
    printf("工号\t姓名\t入厂年月\t职称\t工作部门\t工资 \n"); 
    printf("%s\t%s\t\t%s\t%s\t\t%s\t%s\n",
    p->worker.num,p->worker.name,p->worker.inday,p->worker.job,p->worker.department,p->worker.salary);
    
    while(q!=NULL)
    {
        //大于前结点而且小于后结点,插入于中间 
        if( (strcmp(p->worker.name,pre->worker.num) > 0 )&&( strcmp(p->worker.name,q->worker.num) < 0 ) )
        {
            p->next=q;
            p->prior=q->prior;
            q->prior=p;
            p->prior->next=p;
            break;
        }    
        //插入于最后一个的后面    
        if( (q->next==NULL)&& ( strcmp(p->worker.name,pre->worker.num) > 0 ))
        {
            q->next=p;
            p->prior=q;
            p->next=NULL;
            break;
        }
        pre=q;
        q=q->next; 
        q->prior=pre;        
    }             
}


经过答主“浪客”的解惑后,我做出了如下改变,对不起是我不行还是改不出来呜ww



![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/19452348262611.jpg)
还把文件搞成乱码了。啊。(原本是一条职工信息的。)


![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/306644482626143.jpg)

//1.增加职工
int addWorker (Node *worker)    
{    char addNum[20],addName[20],addJob[20],adddepartment[20];
    int num=0,i;
    Node *p,*q,*pre,*k;
    q=pre=worker;    //头结点不存储数据 
    k=worker->next;
//    if(q->next !=NULL) 
//    {
//        pre=q;
//        q=q->next; 
//        q->prior=pre;
//    }
    p=(Node *)malloc(sizeof(Node));
    printf("请依次输入数据:\n"); 
    Node *pp=p ;
        {        printf("工号:\n");
                scanf("%s",&p->worker.num);
                while(pp!=NULL) 
                {    
                    if(strcmp(p->worker.num,pp->worker.num)==0)
                    {
                        num++;
                        if(num==1)
                        {
                            printf("该工号已存在,请重新输入:"); 
                            
                            scanf("%s",p->worker.num);
                            continue;//前方法错误:break;还有p=p->next;改变了上下两条信息所指的结点,因为信息结点不同所以出现断层,运行中断 
                            pp=p; 
                            printf("姓名:\n");
                            scanf("%s",&p->worker.name);
                            pp=p;
                            printf("入厂年月:\n");
                            scanf("%s",&p->worker.inday);
                            pp=p;
                            printf("职称:\n");
                            scanf("%s",&p->worker.job);
                            pp=p;
                            printf("工作部门:\n");
                            scanf("%s",&p->worker.department);
                            pp=p;
                            printf("工资:\n");
                            scanf("%s",&p->worker.salary);
                            printf("新增职工信息如下:\n\n");
                                printf("工号\t姓名\t入厂年月\t职称\t工作部门\t工资 \n"); 
                                printf("%s\t%s\t\t%s\t%s\t\t%s\t%s\n",
                                p->worker.num,p->worker.name,p->worker.inday,p->worker.job,p->worker.department,p->worker.salary);
                                
                        } 
                            
                    }
                    pp=pp->next; 
                }
        }
            while(q!=NULL)
        {
            //大于前结点而且小于后结点,插入于中间 
            if( (strcmp(p->worker.name,pre->worker.num) > 0 )&&( strcmp(p->worker.name,q->worker.num) < 0 ) )
            {
                p->next=q;
                p->prior=q->prior;
                q->prior=p;
                p->prior->next=p;
                break;
            }    
            //插入于最后一个的后面    
            if( (q->next==NULL)&& ( strcmp(p->worker.name,pre->worker.num) > 0 ))
            {
                q->next=p;
                p->prior=q;
                p->next=NULL;
                break;
            }
            pre=q;
            q=q->next; 
            q->prior=pre;        
        }             
    
}    
  • 写回答

2条回答 默认 最新

  • qfl_sdu 2021-07-15 00:02
    关注

    printf("工号:\n");
    scanf("%s",&p->worker.num);//如果num是一个字符数组,那么就不需要加&符号
    scanf("%s",&p->worker.num);改为scanf("%s",p->worker.num);

    下面的那些输入都是一个同一个问题:
    printf("姓名:\n");
    scanf("%s",p->worker.name);//去掉&

    printf("入厂年月:\n");
    scanf("%s",p->worker.inday);//去掉&
    
    printf("职称:\n");
    scanf("%s",p->worker.job);//去掉&
    
    printf("工作部门:\n");
    scanf("%s",p->worker.department);//去掉&
    
    printf("工资:\n");
    scanf("%s",p->worker.salary);printf("姓名:\n");//去掉&
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 10月22日
  • 已采纳回答 10月14日
  • 修改了问题 7月15日
  • 修改了问题 7月15日
  • 展开全部

悬赏问题

  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥15 绘制多分类任务的roc曲线时只画出了一类的roc,其它的auc显示为nan
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?