- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
-
- typedef struct worker
- {
- ? ? char no[12]; ? ? ? ? //职工工号
- ? ? char name[40]; ? ? ? //姓名
- ? ? int month[12]; ? ? ? //月份
- ? ? float gz[12]; ? ? ? ?//月工资
- ? ? float total; ? ? ? ? //年度总工资
- ? ? struct worker *next; //指向下一节点的指针
- } Worker;
-
- //相关的函数声明
- Worker *CreateList(Worker *L, int n); ? ? ? ? ? ? ? //根据输入的职工人数,批量创建节点
- void DeleteList(Worker *L, char n[]); ? ? ? ? ? ? ? //删除节点
- void LIstSearch(Worker *L, char n[]); ? ? ? ? ? ? ? //查找职工工资信息
- void InsertInfo(Worker *L); ? ? ? ? ? ? ? ? ? ? ? ? //插入职工工资信息
- void SearchMonthSalary(Worker *L, char n[], int m); //查找某个职工的某个月的工资
- void Input(Worker *p, int i); ? ? ? ? ? ? ? ? ? ? ? //为节点的数据域赋值
- void Print(Worker *L); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//输出整个链表的数据
- void Modify(Worker *L, char n[], int m, float s); ? //修改某个职工的工资
- void menu(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//工资管理系统的菜单
- void Save(Worker *L); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //将职工的工资信息保存至文件
- void Bubble_sort(Worker *L); ? ? ? ? ? ? ? ? ? ? ? ?//冒泡排序实现对链表节点的排序
- void StatiTotal(Worker *L,char n[]); ? ? ? ? ? ? ? ?//统计某个职工年度总工资
-
- //根据输入的职工人数,批量创建节点
- Worker *CreateList(Worker *L, int n) //n为输入的职工人数
- {
- ? ? int i;
- ? ? for (i = 0; i < n; i++)
- ? ? {
- ? ? ? ? Worker *p;?? ??? ??? ??? ??? ??? ??? ??? ??? ?//将新生成的节点插入到链表中
- ? ? ? ? p = NULL;
- ? ? ? ? p = (Worker *)malloc(sizeof(Worker));
- ? ? ? ? Input(p, i);?? ??? ??? ??? ??? ??? ??? ??? ?//为节点的数据域赋值
- ? ? ? ? p->next = L->next;
- ? ? ? ? L->next = p;
- ? ? }
- ? ? return L;
- }
-
- void DeleteList(Worker *L, char n[]) //按姓名删除职工信息
- {
- ? ? int i;
- ? ? Worker *p = L->next, *pre = L; //定义p指针指向头节点的指向,定义pre指向头节点,pre始终指向p的前驱节点
- ? ? if (p == NULL)
- ? ? ? ? printf("数据为空,无法删除!");
- ? ? else
- ? ? {
- ? ? ? ? while (strcmp(p->name, n) != 0)
- ? ? ? ? {
- ? ? ? ? ? ? pre = p;
- ? ? ? ? ? ? p = pre->next;
- ? ? ? ? ? ? if (p == NULL)
- ? ? ? ? ? ? {
- ? ? ? ? ? ? ? ? printf("没有找到相关信息,无法删除\n");
- ? ? ? ? ? ? ? ? return;
- ? ? ? ? ? ? }
- ? ? ? ? }
- ? ? ? ? pre->next = p->next;
- ? ? ? ? free(p);
- ? ? ? ? printf("删除成功");
- ? ? }
- }
-
- //向链表中插入职工工资信息
- void InsertInfo(Worker *L)
- {
- ? ? int j, k;
- ? ? Worker *p = NULL;
- ? ? p = (Worker *)malloc(sizeof(Worker)); //生成一个新节点p
- ? ? p->total = 0;
- ? ? printf("请输入要插入的职工的职工工号:");
- ? ? scanf("%s", &p->no);
- ? ? printf("请输入要插入的职工的姓名:");
- ? ? scanf("%s", &p->name);
- ? ? for (k = 0, j = 1; j <= 12, k < 12; j++, k++)
- ? ? ? ? p->month[k] = j;
- ? ? printf("请输入要插入的职工的月工资(用空格隔开):");
- ? ? for (j = 0; j < 12; j++)
- ? ? {
- ? ? ? ? scanf("%f", &p->gz[j]); //输入每个月的工资
- ? ? ? ? p->total += p->gz[j]; ? //计算总工资
- ? ? }
- ? ? p->next = L->next;
- ? ? L->next = p;
- ? ? printf("插入成功!");
- }
-
- void LIstSearch(Worker *L, char n[])
- {
- ? ? int i;
- ? ? Worker *p = L->next;
- ? ? while (p != NULL)
- ? ? {
- ? ? ? ? if (strcmp(p->name, n) == 0)
- ? ? ? ? {
- ? ? ? ? ? ? printf("\n该职工的工资的信息如下:\n");
- ? ? ? ? ? ? printf("职工编号:");
- ? ? ? ? ? ? printf("%s\t\n", p->no);
- ? ? ? ? ? ? printf("姓名:");
- ? ? ? ? ? ? printf("%s\n", p->name);
- ? ? ? ? ? ? printf("该职工12个月的月工资如下:");
- ? ? ? ? ? ? for (i = 0; i < 12; i++)
- ? ? ? ? ? ? ? ? printf("%.2f ", p->gz[i]);
- ? ? ? ? ? ? printf("\n该职工的年度总工资为:");
- ? ? ? ? ? ? printf("%.2f", p->total);
- ? ? ? ? ? ? printf("\n\n");
- ? ? ? ? ? ? printf("\n");
- ? ? ? ? ? ? p = p->next;
- ? ? ? ? }
- ? ? ? ? else
- ? ? ? ? ? ? p = p->next;
- ? ? }
- }
-
- void SearchMonthSalary(Worker *L, char n[], int m)
- {
- ? ? int i;
- ? ? Worker *p = L->next;
- ? ? while (p != NULL)
- ? ? {
- ? ? ? ? if (strcmp(p->name, n) == 0)
- ? ? ? ? {
- ? ? ? ? ? ? switch (m)
- ? ? ? ? ? ? {
- ? ? ? ? ? ? case 1:
- ? ? ? ? ? ? ? ? printf("该职工%d月的工资为%.2f", p->month[0], p->gz[0]);
- ? ? ? ? ? ? ? ? break;
- ? ? ? ? ? ? case 2:
- ? ? ? ? ? ? ? ? printf("该职工%d月的工资为%.2f", p->month[1], p->gz[1]);
- ? ? ? ? ? ? ? ? break;
- ? ? ? ? ? ? case 3:
- ? ? ? ? ? ? ? ? printf("该职工%d月的工资为%.2f", p->month[2], p->gz[2]);
- ? ? ? ? ? ? ? ? break;
- ? ? ? ? ? ? case 4:
- ? ? ? ? ? ? ? ? printf("该职工%d月的工资为%.2f", p->month[3], p->gz[3]);
- ? ? ? ? ? ? ? ? break;
- ? ? ? ? ? ? case 5:
- ? ? ? ? ? ? ? ? printf("该职工%d月的工资为%.2f", p->month[4], p->gz[4]);
- ? ? ? ? ? ? ? ? break;
- ? ? ? ? ? ? case 6:
- ? ? ? ? ? ? ? ? printf("该职工%d月的工资为%.2f", p->month[5], p->gz[5]);
- ? ? ? ? ? ? ? ? break;
- ? ? ? ? ? ? case 7:
- ? ? ? ? ? ? ? ? printf("该职工%d月的工资为%.2f", p->month[6], p->gz[6]);
- ? ? ? ? ? ? ? ? break;
- ? ? ? ? ? ? case 8:
- ? ? ? ? ? ? ? ? printf("该职工%d月的工资为%.2f", p->month[7], p->gz[7]);
- ? ? ? ? ? ? ? ? break;
- ? ? ? ? ? ? case 9:
- ? ? ? ? ? ? ? ? printf("该职工%d月的工资为%.2f", p->month[8], p->gz[8]);
- ? ? ? ? ? ? ? ? break;
- ? ? ? ? ? ? case 10:
- ? ? ? ? ? ? ? ? printf("该职工%d月的工资为%.2f", p->month[9], p->gz[9]);
- ? ? ? ? ? ? ? ? break;
- ? ? ? ? ? ? case 11:
- ? ? ? ? ? ? ? ? printf("该职工%d月的工资为%.2f", p->month[10], p->gz[10]);
- ? ? ? ? ? ? ? ? break;
- ? ? ? ? ? ? case 12:
- ? ? ? ? ? ? ? ? printf("该职工%d月的工资为%.2f", p->month[11], p->gz[11]);
- ? ? ? ? ? ? ? ? break;
- ? ? ? ? ? ? default:
- ? ? ? ? ? ? ? ? break;
- ? ? ? ? ? ? }
- ? ? ? ? ? ? p = p->next;
- ? ? ? ? }
- ? ? ? ? else
- ? ? ? ? ? ? p = p->next;
- ? ? }
- }
-
- void Bubble_sort(Worker *L)//冒泡排序实现对链表节点的排序
- {
- ?? ?Worker *p,*q,*tail,*l;
- ? ? tail = NULL;
- ? ? while((L->next->next) != tail)
- ? ? {
- ? ? ? ? p = L;
- ? ? ? ? q = L->next;
- ? ? ? ? while(q->next != tail)
- ? ? ? ? {
- ? ? ? ? ? ? if((q->total) > (q->next->total))
- ? ? ? ? ? ? {
- ? ? ? ? ? ? ? ? p->next = q->next;
- ? ? ? ? ? ? ? ? q->next = q->next->next;
- ? ? ? ? ? ? ? ? p->next->next = q;
- ? ? ? ? ? ? ? ? q = p->next;
- ? ? ? ? ? ? }
- ? ? ? ? ? ? q = q->next;
- ? ? ? ? ? ? p = p->next;
- ? ? ? ? }
- ? ? ? ? tail = q;
- ? ? }
- ? ? printf("排序完成!年度总工资从小到大结果如下:\n");
- ? ? l=L->next;
- ? ? while(l!=NULL)
- ? ? {
- ? ? ? ? if(l->next!=NULL)
- ? ? ? ? ? ? {
- ? ? ? ? ? ? ? ? printf("%s->",l->name);
- ? ? ? ? ? ? ? ? l=l->next;
- ? ? ? ? ? ? }
- ? ? ? ? else
- ? ? ? ? {
- ? ? ? ? ? ? printf("%s",l->name);
- ? ? ? ? ? ? l=l->next;
- ? ? ? ? }
- ? ? }
- }
-
- void StatiTotal(Worker *L,char n[]) ? ? ? ? //统计某个职工年度总工资
- {
- ? ? int i;
- ? ? Worker *p=L->next;
- ? ? while(p!=NULL)
- ? ? {
- ?? ??? ?p->total=0;
- ? ? ? ? if(strcmp(p->name,n)==0)
- ? ? ? ? {
- ? ? ? ? ? ? for(i=0;i<12;i++)
- ? ? ? ? ? ? ? ? p->total+=p->gz[i];
- ? ? ? ? ? ? printf("%s的年度总工资为%.2f",n,p->total);
- ?? ??? ??? ?break;
- ? ? ? ? }
- ? ? ? ? else
- ? ? ? ? ? ? p=p->next;
- ? ? }
-
- }
-
- void Modify(Worker *L, char n[], int m, float s)
- {
- ? ? int i,j;
- ? ? Worker *p = L->next;
- ? ? while (p != NULL)
- ? ? {
- ? ? ? ? if (strcmp(p->name, n) == 0)
- ? ? ? ? {
- ? ? ? ? ? ? switch (m)
- ? ? ? ? ? ? {
- ? ? ? ? ? ? case 1:
- ? ? ? ? ? ? ? ? p->gz[0] = s;
- ? ? ? ? ? ? ? ? break;
- ? ? ? ? ? ? case 2:
- ? ? ? ? ? ? ? ? p->gz[1] = s;
- ? ? ? ? ? ? ? ? break;
- ? ? ? ? ? ? case 3:
- ? ? ? ? ? ? ? ? p->gz[2] = s;
- ? ? ? ? ? ? ? ? break;
- ? ? ? ? ? ? case 4:
- ? ? ? ? ? ? ? ? p->gz[3] = s;
- ? ? ? ? ? ? ? ? break;
- ? ? ? ? ? ? case 5:
- ? ? ? ? ? ? ? ? p->gz[4] = s;
- ? ? ? ? ? ? ? ? break;
- ? ? ? ? ? ? case 6:
- ? ? ? ? ? ? ? ? p->gz[5] = s;
- ? ? ? ? ? ? ? ? break;
- ? ? ? ? ? ? case 7:
- ? ? ? ? ? ? ? ? p->gz[6] = s;
- ? ? ? ? ? ? ? ? break;
- ? ? ? ? ? ? case 8:
- ? ? ? ? ? ? ? ? p->gz[7] = s;
- ? ? ? ? ? ? ? ? break;
- ? ? ? ? ? ? case 9:
- ? ? ? ? ? ? ? ? p->gz[8] = s;
- ? ? ? ? ? ? ? ? break;
- ? ? ? ? ? ? case 10:
- ? ? ? ? ? ? ? ? p->gz[9] = s;
- ? ? ? ? ? ? ? ? break;
- ? ? ? ? ? ? case 11:
- ? ? ? ? ? ? ? ? p->gz[10] = s;
- ? ? ? ? ? ? ? ? break;
- ? ? ? ? ? ? case 12:
- ? ? ? ? ? ? ? ? p->gz[11] = s;
- ? ? ? ? ? ? ? ? break;
- ? ? ? ? ? ? default:
- ? ? ? ? ? ? ? ? break;
- ? ? ? ? ? ? }
- ? ? ? ? ? ? p->total=0;
- ? ? ? ? ? ? for(j=0;j<12;j++)
- ? ? ? ? ? ? ? ? p->total+=p->gz[j];
- ? ? ? ? ? ? p=p->next;
- ? ? ? ? }
- ? ? ? ? else
- ? ? ? ? ? ? p = p->next;
- ? ? }
- ? ? printf("修改成功!");
- }
- void Input(Worker *p, int i)
- {
- ? ? int j, k;
- ? ? p->total = 0;
- ? ? printf("请输入第%d名职工的职工工号:", i + 1);
- ? ? scanf("%s", &p->no);
- ? ? printf("请输入第%d名职工的姓名:", i + 1);
- ? ? scanf("%s", &p->name);
- ? ? for (k = 0, j = 1; j <= 12, k < 12; j++, k++)
- ? ? ? ? p->month[k] = j;
- ? ? printf("请输入第%d名职工的月工资(用空格隔开):", i + 1);
- ? ? for (j = 0; j < 12; j++)
- ? ? {
- ? ? ? ? scanf("%f", &p->gz[j]); //输入每个月的工资
- ? ? ? ? p->total += p->gz[j]; ? //计算总工资
- ? ? }
- }
-
- void Print(Worker *L) ? ? ? //打印所有职工工资信息
- {
- ? ? int i;
- ? ? Worker *p = L->next;
- ? ? while (p != NULL)
- ? ? {
- ? ? ? ? printf("职工编号:");
- ? ? ? ? printf("%s\t\n", p->no);
- ? ? ? ? printf("姓名:");
- ? ? ? ? printf("%s\n", p->name);
- ? ? ? ? printf("该职工12个月的月工资如下:");
- ? ? ? ? for (i = 0; i < 12; i++)
- ? ? ? ? ? ? printf("%.2f ", p->gz[i]);
- ? ? ? ? printf("\n该职工的年度总工资为:");
- ? ? ? ? printf("%.2f", p->total);
- ? ? ? ? printf("\n\n");
- ? ? ? ? p = p->next;
- ? ? }
- }
-
- void Save(Worker *L)
- {
- ? ? int i;
- ? ? Worker *p = L->next;
- ? ? FILE *fp = fopen("WorkerSalaryInfo.txt", "w");
- ? ? while (p != NULL)
- ? ? {
- ? ? ? ? fprintf(fp, "职工编号:");
- ? ? ? ? fprintf(fp, "%s\t\n", p->no);
- ? ? ? ? fprintf(fp, "姓名:");
- ? ? ? ? fprintf(fp, "%s\n", p->name);
- ? ? ? ? fprintf(fp, "该职工12个月的月工资如下:");
- ? ? ? ? for (i = 0; i < 12; i++)
- ? ? ? ? ? ? fprintf(fp, "%.2f ", p->gz[i]);
- ? ? ? ? fprintf(fp, "\n该职工的年度总工资为:");
- ? ? ? ? fprintf(fp, "%.2f", p->total);
- ? ? ? ? fprintf(fp, "\n\n");
- ? ? ? ? p = p->next;
- ? ? }
- ? ? fclose(fp);
- ? ? printf("保存成功,已保存至当前目录下的‘WorkerSalaryInfo.txt'文件中");
- }
-
- void menu()
- {
- ?? ?printf("\t\t\t\t\t?? ??? ??? ??? ? ? ?? ??? ??? ??? ??? ??? ??? ?\n");
- ? ? printf("\t\t\t\t\t▔▔▔▔▔▔▔欢迎进入工资管理系统▔▔▔▔▔▔▔\n");
- ? ? printf("\t\t\t\t\t1.录入职工每个月的工资信息?? ??? ??? ??? ??? ?\n");
- ? ? printf("\t\t\t\t\t2.按姓名查找某个员工各月的工资?? ??? ??? ??? ?\n");
- ? ? printf("\t\t\t\t\t3.按姓名查找某个职工的某个月的工资?? ??? ??? ?\n");
- ? ? printf("\t\t\t\t\t4.修改某个职工某个月的工资?? ??? ??? ??? ??? ?\n");
- ? ? printf("\t\t\t\t\t5.删除某个职工的相关信息?? ??? ??? ??? ? ? ? ?? ?\n");
- ? ? printf("\t\t\t\t\t6.插入职工工资信息?? ??? ??? ??? ??? ??? ??? ?\n");
- ? ? printf("\t\t\t\t\t7.统计某个职工年度总工资?? ??? ??? ??? ??? ? ? ?\n");
- ? ? printf("\t\t\t\t\t8.对职工的年度总工资进行从小到大排名?? ??? ??? ?\n");
- ? ? printf("\t\t\t\t\t9.输出所有职工工资信息?? ??? ??? ??? ??? ??? ?\n");
- ? ? printf("\t\t\t\t\t10、将所有职工的工资信息保存至文件?? ??? ??? ?\n");
- ? ? printf("\t\t\t\t\t0.退出?? ??? ??? ??? ??? ??? ??? ??? ? ? ?\n");
- ? ? printf("\t\t\t\t\t▁▁▁▁▁▁▁▁▁▁谢谢使用▁▁▁▁▁▁▁▁▁\n");
- }
-
- int main()
- {
- ? ? int item, n, m; //item用于接收输入的命令,n用于接收输入的职工人数
- ? ? float s;
- ? ? char nam[10];
- ? ? Worker *L = (Worker*)malloc(sizeof(Worker));
- ? ? L->next=NULL;
- ? ? do
- ? ? {
- ? ? ?? ?system("cls");?
- ? ? ? ? menu();
- ? ? ? ? printf("\n请输入相应的数字,进行相应的操作:\n");
- ? ? ? ? scanf("%d", &item);
- ? ? ? ? switch (item)
- ? ? ? ? {
- ? ? ? ? case 1:
- ? ? ? ? ? ? printf("请输入您要录入的职工人数:");
- ? ? ? ? ? ? scanf("%d", &n);
- ? ? ? ? ? ? L = CreateList(L, n);
- ? ? ? ? ? ? getchar();
- ? ? ? ? ? ? printf("\n请按任意键返回主菜单\n");
- ?? ??? ??? ?getchar();
- ? ? ? ? ? ? break;
- ? ? ? ? case 2:
- ? ? ? ? ? ? printf("请输入您要查找的职工姓名:");
- ? ? ? ? ? ? scanf("%s", &nam);
- ? ? ? ? ? ? LIstSearch(L, nam);
- ? ? ? ? ? ? getchar();
- ? ? ? ? ? ? printf("\n请按任意键返回主菜单\n");
- ?? ??? ??? ?getchar();
- ? ? ? ? ? ? break;
- ? ? ? ? case 3:
- ? ? ? ? ? ? printf("请输入您要查找的职工的姓名:");
- ? ? ? ? ? ? scanf("%s", &nam);
- ? ? ? ? ? ? printf("请输入您要查找该职工第几个月的工资(1到12):");
- ? ? ? ? ? ? scanf("%d", &m);
- ? ? ? ? ? ? SearchMonthSalary(L, nam, m);
- ? ? ? ? ? ? getchar();
- ? ? ? ? ? ? printf("\n请按任意键返回主菜单\n");
- ?? ??? ??? ?getchar();
- ? ? ? ? ? ? break;
- ? ? ? ? case 4:
- ? ? ? ? ? ? printf("请输入您要修改的职工姓名:");
- ? ? ? ? ? ? scanf("%s", &nam);
- ? ? ? ? ? ? printf("\n请输入您要修改的月份:");
- ? ? ? ? ? ? scanf("%d", &m);
- ? ? ? ? ? ? printf("\n请输入您修改后的数据:");
- ? ? ? ? ? ? scanf("%f", &s);
- ? ? ? ? ? ? Modify(L, nam, m, s);
- ? ? ? ? ? ? getchar();
- ? ? ? ? ? ? printf("\n请按任意键返回主菜单\n");
- ?? ??? ??? ?getchar();
- ? ? ? ? ? ? break;
- ? ? ? ? case 5:
- ? ? ? ? ? ? printf("请输入您要删除的职工姓名:");
- ? ? ? ? ? ? scanf("%s", &nam);
- ? ? ? ? ? ? DeleteList(L, nam);
- ? ? ? ? ? ? getchar();
- ? ? ? ? ? ? printf("\n请按任意键返回主菜单\n");
- ?? ??? ??? ?getchar();
- ? ? ? ? ? ? break;
- ? ? ? ? case 6:
- ? ? ? ? ? ? InsertInfo(L);
- ? ? ? ? ? ? getchar();
- ? ? ? ? ? ? printf("\n请按任意键返回主菜单\n");
- ?? ??? ??? ?getchar();
- ? ? ? ? ? ? break;
- ? ? ? ? case 7:
- ? ? ? ? ? ? printf("请输入您要查询的职工姓名:");
- ? ? ? ? ? ? scanf("%s",&nam);
- ? ? ? ? ? ? StatiTotal(L,nam);
- ? ? ? ? ? ? getchar();
- ? ? ? ? ? ? printf("\n请按任意键返回主菜单\n");
- ?? ??? ??? ?getchar();
- ? ? ? ? ? ? break;
- ? ? ? ? case 8:
- ? ? ? ? ? ? Bubble_sort(L);
- ? ? ? ? ? ? getchar();
- ? ? ? ? ? ? printf("\n请按任意键返回主菜单\n");
- ?? ??? ??? ?getchar();
- ? ? ? ? ? ? break;
- ? ? ? ? case 9:
- ? ? ? ? ? ? printf("全部职工的信息如下:\n\n");
- ? ? ? ? ? ? Print(L);
- ? ? ? ? ? ? getchar();
- ? ? ? ? ? ? printf("\n请按任意键返回主菜单\n");
- ?? ??? ??? ?getchar();
- ? ? ? ? ? ? break;
- ? ? ? ? case 10:
- ? ? ? ? ? ? Save(L);
- ? ? ? ? ? ? getchar();
- ? ? ? ? ? ? printf("\n请按任意键返回主菜单\n");
- ?? ??? ??? ?getchar();
- ? ? ? ? ? ? break;
- ? ? ? ? case 0:
- ? ? ? ? ? ? printf("谢谢您使用工资管理系统,即将退出工资管理系统.....");
- ? ? ? ? ? ? exit(0);
- ? ? ? ? ? ? break;
- ? ? ? ? }
- ? ? ? ? printf("\n\n\n\n");
- ? ? } while (item);
- ? ? return 0;
- }