主题:新手求助……帮忙看一下!
lei2621
[专家分:0] 发布于 2011-09-08 10:16:00
最近老师要求做一个C的课设,大一的时候对c就不是很感冒……折腾了好久了……其中还是有两个问题。1:统计和排序的时候,工资数据类显示错误2:统计的时候显示屯屯屯屯屯屯……求高手指点帮忙改进……
不好意思第一次发帖子……有点乱……这个是错误源码……
最后更新于:2011-09-08 10:24:00
回复列表 (共5个回复)
沙发
lei2621 [专家分:0] 发布于 2011-09-08 10:18:00
//插入记录:按工号查询到要插入的节点的位置,然后在该工号之后插入一个新节点。
void Insert(Link l)
{
Node *s,*r,*p; /*p指向插入位置,p指新插入记录节点*/
char ch,new_num[10],old_num[10];
//old_num[]保存插入点位置之前的工号,new_num[]保存输入的新记录的工号
int flag=0;
s=l->next;
system("cls");
Disp(l);
while(1)
{
//stringinput(s,10,"please input insert location after the Number:");
printf("请你输入已存在的工号(以'0'返回上一级菜单:)");
scanf("%s",old_num);
if(strcmp(old_num,"0")==0) //输入'0',跳出while(1),即跳出Insert()函数
return;
s=l->next; //作用? 每次从第一个节点开始找
flag=0;
while(s) /*查询该工号是否存在,flag=1表示该工号存在*/
{
if(strcmp(s->data.num,old_num)==0)
{
flag=1;
break;
}
s=s->next;
}
if(flag==1)
break; /*若工号存在,则进行插入之前的新记录的输入操作*/
else
{
getchar();
printf("\n=====>The number %s is not existing,try again?(y/n):",old_num);
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
{continue;}
else
{return;} //回主菜单
}
}//while(1)
/*以下新记录的插入新节点,工号不能跟已存在的工号相同,操作与Add()相同*/
printf("请你输入待插入的工号(以'0'返回上一级菜单:)");
scanf("%s",new_num);
if(strcmp(new_num,"0")==0) //输入'0',跳出while(1),即跳出add()函数
return;
s=l->next; //作用? 每次从第一个节点开始找,看num是否重复。
while(s) //工号重复时,返回主菜单
{
if(strcmp(s->data.num,new_num)==0)
{
printf("=====>提示:工号为'%s'的职工已经存在'!\n",new_num);
flag=1;
return ;
}
s=s->next;
} //while(s)
p=(Node *)malloc(sizeof(Node));
if(!p)
{
printf("\n allocate memory failure "); /*如没有申请到,打印提示信息*/
return ; /*返回主界面*/
}
strcpy(p->data.num,new_num);
printf("请你输入姓名:");
scanf("%s",p->data.name);
getchar();
printf("请你输入性别:");
scanf("%s",p->data.sex);
getchar();
printf("请你输入部门:");
scanf("%d",&p->data.bm);
getchar();
printf("请你输入职称:");
scanf("%d",&p->data.zc);
getchar();
printf("请你输入工资:");
scanf("%d",&p->data.gz);
getchar();
// 信息输入已经完成
p->next=NULL; /*表明这是链表的尾部结点*/
saveflag=1; /*在main()有对该全局变量的判断,若为1,则进行存盘操作*/
/*将指针赋值给r,因为l中的头节点的下一个节点才实际保存着学生的记录*/
r=l->next;
while(1)
{
if(strcmp(r->data.num,old_num)==0) /*在链表中插入一个节点*/
{
p->next=r->next;
r->next=p;
break;
}
r=r->next;
}// while(1) , r作为查询指针,依次从第一个节点找起,找到后 跳出 while(1)循环
Disp(l);
printf("\n\n");
// getchar();
}
板凳
lei2621 [专家分:0] 发布于 2011-09-08 10:19:00
void Tongji(Link l) //统计
{
Node *max,*min;/*用于指向工资最高的节点*/
Node *t=l->next;
if(!t)
{
system("cls");
printf("\n=====>Not employee record!\n");
getchar();
return;
}
system("cls");
Disp(l);
max=min=t;
while(t)
{
if(t->data.gz>=max->data.gz) max=t;
if(t->data.gz<=min->data.gz) min=t;
t=t->next;
printf("最高工资为:%d\n",max);
printf("\t%s\t%s\t%s\t%s\t%s\t%d\n\n",t->data.num,t->data.name,t->data.sex,t->data.bm,t->data.zc,t->data.gz);
printf("最低工资为:%d\n",min);
printf("\t%s\t%s\t%s\t%s\t%s\t%d\n\n",t->data.num,t->data.name,t->data.sex,t->data.bm,t->data.zc,t->data.gz);
}
}
void Sort(Link l) //排序
{
Link ll;
Node *p,*rr,*s;
int i=0;
if(l->next==NULL)
{ system("cls");
printf("\n=====>Not employee record!\n");
getchar();
return ;
}
ll=(Node*)malloc(sizeof(Node)); /*用于创建新的节点*/
if(!ll)
{
printf("\n allocate memory failure "); /*如没有申请到,打印提示信息*/
return ; /*返回主界面*/
}
ll->next=NULL;
system("cls");
Disp(l); /*显示排序前的所有职工记录*/
p=l->next;
while(p) /*p!=NULL*/
{
s=(Node*)malloc(sizeof(Node)); /*新建节点用于保存从原链表中取出的节点信息*/
if(!s) /*s==NULL*/
{
printf("\n allocate memory failure "); /*如没有申请到,打印提示信息*/
return ; /*返回主界面*/
}
s->data=p->data; /*填数据域*/
s->next=NULL; /*指针域为空*/
rr=ll;
/*rr链表于存储插入单个节点后保持排序的链表,ll是这个链表的头指针,每次从头开始查找插入位置*/
while(rr->next!=NULL && rr->next->data.gz>=p->data.gz)
{rr=rr->next;} /*指针移至总分比p所指的节点的总分小的节点位置*/
if(rr->next==NULL)/*若新链表ll中的所有节点的总分值都比p->data.gz大时,就将p所指节点加入链表尾部*/
rr->next=s;
else /*否则将该节点插入至第一个总分字段比它小的节点的前面*/
{
s->next=rr->next;
rr->next=s;
}
p=p->next; /*原链表中的指针下移一个节点*/
}
l->next=ll->next; /*ll中存储是的已排序的链表的头指针*/
Disp(l);
saveflag=1;
printf("\n =====>sort complete!\n");
}
void Save(Link l)
{
FILE* fp;
Node *p; //实现保存操作的临时的结构体指针变量
int flag=1,count=0;
fp=fopen("employee.txt","wb");
if(fp==NULL)
{
printf("\n=====>提示:重新打开文件时发生错误!\n");
return;
}
p=l->next; //p指向第一个记录结点
while(p)
{
if(fwrite(p,sizeof(Node),1,fp)==1) //将第一个记录结点值写入文件
{
p=p->next; //依次写入第二个结点的值,
count++; //文件的记录数+1
}
else
{
flag=0;
break;
}
} //while(p)
if(count>0)
{
printf("\n=====>提示:文件保存成功.(有%d条记录已经保存.)\n",count);
saveflag=0;
}
else
{
system("cls");
printf("保存文件失败,'0'条记录被保存!\n");
}
fclose(fp);
} // void Save结束
3 楼
fragileeye [专家分:1990] 发布于 2011-09-08 15:57:00
只看了统计的部分
看这段代码
while(t)
{
if(t->data.gz>=max->data.gz) max=t;
if(t->data.gz<=min->data.gz) min=t;
t=t->next;
printf("最高工资为:%d\n",max);
printf("\t%s\t%s\t%s\t%s\t%s\t%d\n\n",t->data.num,t->data.name,t->data.sex,t->data.bm,t->data.zc,t->data.gz);
printf("最低工资为:%d\n",min);
printf("\t%s\t%s\t%s\t%s\t%s\t%d\n\n",t->data.num,t->data.name,t->data.sex,t->data.bm,t->data.zc,t->data.gz);
}
①:printf里max
②:while查找最高和最低工资时感觉应该是while(){} printf...printf在循环外。。
③:显示乱码很可能是结构中数组元素没有初始化或指针使用非法。(fuck,程序要崩掉该多好)
4 楼
codingman [专家分:0] 发布于 2011-09-13 16:49:00
打印乱码是因为操作系统和编译器字体不一致导致的吧
5 楼
cgl_lgs [专家分:21040] 发布于 2011-09-13 18:04:00
屯屯屯屯代表访问了已释放的空间。
我来回复