回 帖 发 新 帖 刷新版面

主题:新手求助……帮忙看一下!

最近老师要求做一个C的课设,大一的时候对c就不是很感冒……折腾了好久了……其中还是有两个问题。1:统计和排序的时候,工资数据类显示错误2:统计的时候显示屯屯屯屯屯屯……求高手指点帮忙改进……

不好意思第一次发帖子……有点乱……这个是错误源码……

回复列表 (共5个回复)

沙发

//插入记录:按工号查询到要插入的节点的位置,然后在该工号之后插入一个新节点。
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();
       
}


板凳

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 楼

只看了统计的部分

看这段代码
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 楼

打印乱码是因为操作系统和编译器字体不一致导致的吧

5 楼

屯屯屯屯代表访问了已释放的空间。

我来回复

您尚未登录,请登录后再回复。点此登录或注册