添加职工信息模块时运行突然自行停止,甚至自己关闭运行界面,以下是运行结果和代码,求会的详细解析,
//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;
}
}