请修改下列代码使得其可以实现对员工年龄进行从小到大排序的功能代码如下:#includestdioh#includestdlibh#includestringh#includeconiohstruct employee char no40; 职工号 char name40; 职工姓名 char sex10; 职工性别 int age; 职工年龄 struct employee next;
修改后的代码如下:
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<conio.h> struct employee { char no[40]; //职工号 char name[40]; //职工姓名 char sex[10]; //职工性别 int age; //职工年龄 struct employee *next;//下一结点指针 }; typedef struct employee EMP; EMP *h;
void load(); //读文件数据,并创建链表 void save(); //将链表中数据写到文件中 void add(EMP *p); //链表中增加职工结点 void del(char *s); //链表中删除指定姓名的职工结点 void update(); //链表中更新职工结点中的数据 void browse(); //在屏幕上显示链表中所有结点数据 void menu(); //显示系统主菜单 void delEmp(); //删除职工 void addEmp(); //增加职工 void sortEmp(); //排序职工 void main(void) {
int op;//operation
h =(EMP *)malloc(sizeof(EMP)); //创建链表的头结点
h->next = NULL; //初始化链表头节点中下一节点指针为NULL
menu();
scanf("%d",&op);
while(op!=0)
{
switch(op)
{
case 1:
load();
break;
case 2:
save();
break;
case 3:
addEmp();
break;
case 4:
delEmp();
break;
case 5:
update();
break;
case 6:
browse();
break;
case 7:
sortEmp();
break;
}
menu();
scanf("%d",&op);
}
}
//显示系统主菜单函数 void menu() { printf(" Main Menu\n"); printf(" ********************** \n"); printf(" * 0:quit 1 :load * \n"); printf(" * 2:save 3 :add * \n"); printf(" * 4:delete 5 :update * \n"); printf(" * 6:browse 7 :sort * \n"); printf(" ********************** \n"); }
//读文件数据,并创建链表函数 void load() { FILE *fp; char ch;
fp = fopen("data.txt","r");
if(fp==NULL)
{
printf("打开文件错误,按任意返回主菜单\n");
getch();//程序停下来,等待输入
return;
}
while(!feof(fp))
{
EMP *node =(EMP *)malloc(sizeof(EMP));
node->next = NULL;
fscanf(fp,"%s%s%s%d",node->no,node->name,node->sex,&node->age);//从文件中读一行职工信息
add(node); // 调用函数增加链表结点
}
fclose(fp);
}
//链表中增加职工结点的函数 void add(EMP *p) { EMP *q; q = h->next; //将q指针指向链表中第一个职工结点 if(q==NULL) //如果q指针为NULL,则表示当前链表为空 { h->next = p; //p指针指向的结点为链表中第一个结点 p->next = NULL; } else { while(q->next!=NULL) //通过while循环找到链表中最后一个结点 { q = q ->next; } q->next = p; //将q指针指向的最后一个结点的next指针指向新增结点 p->next =NULL; //现在p指针指向的是最后一个结点,因此将该节点的next指针设为NULL }
}
//增加职工函数 void addEmp() { EMP *node; node = (EMP *)malloc(sizeof(EMP)); node->next = NULL; printf("input the employee's no name sex age:\n"); scanf("%s%s%s%d",node->no,node->name,node->sex,&node->age); add(node);
}
//删除职工函数 void delEmp() { char name[40]; printf("input del name:\n"); scanf("%s",name); del(name); }
//在屏幕上显示链表中所有职工结点数据函数 void browse() { EMP *node; node = h->next; //node指针指向链表第一个结点 printf("Employee no name age sex\n"); while(node) //遍历链表 { printf("%12s%6s%5d%4s\n",node->no,node->name,node->age,node->sex); node = node->next; //node指针指向下一个职工结点 } printf("\n"); }
//将链表中数据写到文件中的函数 void save() { FILE *fp; EMP *node; fp = fopen("data.txt","w"); //以写的方式打开文件 node = h->next; //node指针指向链表第一个结点 while(node!=NULL) { //"%s %s %s %d\n" 格式符之间有空格 fprintf(fp,"%s %s %s %d\n",node->no,node->name,node->sex,node->age); node = node ->next; } fclose(fp); }
//删除职工结点的函数 void del(char *s) { EMP *p,*q; p = h->next;//链表中第一个节点 p->next=p->next->next; q = p->next;//链表中第二个节点 if(strcmp(s,p->name)==0) { h->next=p->next; free(p); return; } while(q!=NULL) { if(strcmp(s,q->name)==0) { p->next = q->next; free(q); break; } p = q; q = q->next; } }
//更新职工结点的函数 void update() { char name[40]; int flag = 0; EMP *p; printf("input the name:\n"); scanf("%s",name); p = h->next; while(p!=NULL) { if(strcmp(name,p->name)==0) { printf("input the age:\n"); scanf("%d",&p->age); printf("input the sex:\n"); getchar(); scanf("%c",&p->sex); flag = 1; break; } p=p->next;
}
if(flag==0)
{
printf("error username\n");
}
}
//排序职工结点的函数 void sortEmp() { int n = 0, i, j; EMP *p, *q, *t; p = h->next; while (p != NULL) { n++; p = p->next; } for (i = 0, p = h->next; i < n - 1; i++, p = p->next) { for (j = i + 1, q = p->next; j < n; j++, q = q->next) { if (p->age > q->age) { t = (EMP *)malloc(sizeof(EMP)); memcpy(t, p, sizeof(EMP)); memcpy(p, q, sizeof(EMP)); memcpy(q, t, sizeof(EMP)); free(t); } } } printf("Sort success!\n");
原文地址: https://www.cveoy.top/t/topic/fSec 著作权归作者所有。请勿转载和采集!