#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct staff
{
char name[30],sex[20],education[40],address[100],number[30];//姓名,性别,学历,住址,电话
int num,age;//职工号,年龄
double salary;//工资
struct staff *next;
};
struct staff *head=NULL;
struct staff *head1;
//输入信息
void input(){
struct staff*tail,*p;
if(head==NULL){
head=(struct staff*)malloc(sizeof(struct staff));
p=head;
tail=head;
head->next=NULL;
printf("输入职工姓名:");
scanf("%s",p->name);
getchar();
printf("输入职工号(4位):");
scanf("%d",&p->num);
printf("输入职工性别:");
scanf("%s",p->sex);
getchar();
printf("输入职工年龄:");
scanf("%d",&p->age);
printf("输入职工学历:");
scanf("%s",p->education);
getchar();
printf("输入职工工资:");
scanf("%lf",&p->salary);
printf("输入职工住址:");
scanf("%s",p->address);
getchar();
printf("输入职工电话:");
scanf("%s",p->number);
getchar();
}
else {
for(tail=head;tail->next!=NULL;tail=tail->next){}//遍历链表,找到尾节点
//head->next=NULL;tail=head;
p=(struct staff*)malloc(sizeof(struct staff));
printf("输入职工姓名:");
scanf("%s",p->name);
getchar();
printf("输入职工号(4位):");
scanf("%d",&p->num);
printf("输入职工性别:");
scanf("%s",p->sex);
getchar();
printf("输入职工年龄:");
scanf("%d",&p->age);
printf("输入职工学历:");
scanf("%s",p->education);
getchar();
printf("输入职工工资:");
scanf("%lf",&p->salary);
printf("输入职工住址:");
scanf("%s",p->address);
getchar();
printf("输入职工电话:");
scanf("%s",p->number);
getchar();
p->next=NULL;
tail->next=p;
}
}
//输出信息
void output()
{struct staff*tail=head;
while(tail!=NULL)
{
printf(" 姓名 职工号 性别 年龄 学历 工资 住址 电话");
printf("\n\n");
{
printf("%6s",tail->name);
printf("%16d",tail->num);
printf("%14s",tail->sex);
printf("%14d",tail->age);
printf("%17s",tail->education);
printf("%19.2lf",tail->salary);
printf("%30s",tail->address);
printf("%24s",tail->number);
printf("\n\n");
}
tail=tail->next;
}
}
//查询输出一个职工的信息
int outputone(double salary)
{
struct staff *tail;
for(tail=head;tail->salary!=salary;tail=tail->next){if(tail->next==NULL&&tail->salary!=salary)return -1;}
printf(" 姓名 职工号 性别 年龄 学历 工资 住址 电话");
printf("\n\n");
{
printf("%6s",tail->name);
printf("%16d",tail->num);
printf("%14s",tail->sex);
printf("%14d",tail->age);
printf("%17s",tail->education);
printf("%19.2lf",tail->salary);
printf("%30s",tail->address);
printf("%24s",tail->number);
printf("\n\n");
}
return 1;
}
///单链表结构按工资从高到低排序
void sort() //传进来一个有头节点的链表
{
//传进来一个有头节点的链表
struct staff *tail,*p,*q,*head1=head->next;
tail = NULL;
if(head->salary<(head->next->salary)){
head->next=head->next->next;
head1->next=head;
head=head1;
}
while((head->next->next) != tail)
{
p = head;
q = head->next;
/*冒泡排序的本质将所找到的数都下沉,所以内层循环比外层小一个节点*/
while((q->next) != tail)
{
if((q->salary) < (q->next->salary)) //不停判断两个相邻的数并且交换顺序
{
p->next = q->next;
q->next = q->next->next;
p->next->next = q;
q = p->next; //始终保存p,q是相邻的位置
}
q = q->next;
p = p->next;
}
/*最重要的一步,将tail不停向前移动*/
tail = q;
}
}
// 修改职工信息
void modify() {
int num;
struct staff*p=head;
printf("请输入要修改的职工号:");
scanf("%d", &num);
while (p != NULL) {
if (p->num == num) { // 找到要修改的节点
printf("输入职工姓名:");
scanf("%s",p->name);
getchar();
printf("输入职工号:");
scanf("%d",&p->num);
printf("输入职工性别:");
scanf("%s",p->sex);
printf("输入职工年龄:");
scanf("%d",&p->age);
printf("输入职工学历:");
scanf("%s",p->education);
printf("输入职工工资:");
scanf("%lf",&p->salary);
printf("输入职工住址:");
scanf("%s",p->address);
printf("输入职工电话:");
scanf("%s",p->number);
printf("修改成功!\n\n");
system("cls");
return;
}
p = p->next;
}
printf("未找到该职工!\n\n");
system("cls");
}
//删除
void del() {
int id;
printf("请输入要删除的职工号:");
scanf("%d", &id);
struct staff* p = head;
struct staff* prev = NULL;
while (p != NULL) {
if (p->num == id) { // 找到要删除的节点
if (prev == NULL) { // 如果要删除的节点是头节点
head = p->next;
} else {
prev->next = p->next;
}
free(p); // 释放要删除的节点的内存
printf("删除成功!\n\n");
system("cls");
return;
}
prev = p;
p = p->next;
}
printf("未找到该职工!\n\n");
system("cls");
}
//存入文件
void save()
{struct staff *Tail=NULL,*p1=NULL;//新建文件链表的头结点
head1=NULL;
struct staff *tail=head;//原链表的指针
FILE *fp;
fp = fopen("职工信息管理系统.txt","w");
if(fp == NULL)
{
printf("error!");
exit(0);
}
else
{fprintf(fp," 姓名 职工号 性别 年龄 学历 工资 住址 电话\n");
if(head1==NULL){
head1=(struct staff*)malloc(sizeof(struct staff));
Tail=head1;
head1->next=NULL;
strcpy(Tail->name,tail->name);
//职工号
//性别
//年龄
strcpy(Tail->education,tail->education);
//工资
strcpy(Tail->address,tail->address);
strcpy(Tail->number,tail->number);
strcpy(Tail->sex,tail->sex);
Tail->num=tail->num;
Tail->age=tail->age;
Tail->salary=tail->salary;
fprintf(fp,"%6s",Tail->name);
fprintf(fp,"%16d",Tail->num);
fprintf(fp,"%14s",Tail->sex);
fprintf(fp,"%14d",Tail->age);
fprintf(fp,"%17s",Tail->education);
fprintf(fp,"%19.2lf",Tail->salary);
fprintf(fp,"%30s",Tail->address);
fprintf(fp,"%24s",Tail->number);
fprintf(fp,"\n");
tail=head->next;
}
while(tail!=NULL){
p1=(struct staff*)malloc(sizeof(struct staff));
p1->next=NULL;
Tail->next=p1;
strcpy(p1->name,tail->name);
//职工号
//性别
//年龄
strcpy(p1->education,tail->education);
//工资
strcpy(p1->address,tail->address);
strcpy(p1->number,tail->number);
strcpy(p1->sex,tail->sex);
p1->num=tail->num;
p1->age=tail->age;
p1->salary=tail->salary;
fprintf(fp,"%6s",p1->name);
fprintf(fp,"%16d",p1->num);
fprintf(fp,"%14s",p1->sex);
fprintf(fp,"%14d",p1->age);
fprintf(fp,"%17s",p1->education);
fprintf(fp,"%19.2lf",p1->salary);
fprintf(fp,"%30s",p1->address);
fprintf(fp,"%24s",p1->number);
fprintf(fp,"\n");
Tail=p1;
tail=tail->next;
}
printf("文件写入成功\n");
}
fclose(fp);
}
// 读取文件
struct staff* read(struct staff*head1)
{
struct staff* head = NULL;
struct staff* tail = NULL;
FILE* fp;
fp = fopen("职工信息管理系统.txt", "r");
if (fp == NULL)
{
printf("打开文件失败!\n");
exit(1);
}
// 跳过表头
char header[200];
fgets(header, sizeof(header), fp);
printf(" 姓名 职工号 性别 年龄 学历 工资 住址 电话");
printf("\n\n");
while (!feof(fp)) {
struct staff* p = (struct staff*)malloc(sizeof(struct staff));
if(p == NULL) {
printf("内存分配失败!\n");
exit(1);
}
// 从文件中读取数据
if (fscanf(fp, "%s%d%s%d%s%lf%s%s",p->name, &p->num, p->sex, &p->age, p->education, &p->salary, p->address, p->number) != 8) {
free(p); // 如果读取失败,释放内存
break;
}
p->next = NULL;
if (head == NULL) {
head = p;
tail = p;
}
else {
tail->next = p;
tail = p;
}
printf("%6s",p->name);
printf("%16d",p->num);
printf("%14s",p->sex);
printf("%14d",p->age);
printf("%17s",p->education);
printf("%19.2lf",p->salary);
printf("%30s",p->address);
printf("%24s",p->number);
printf("\n\n");
}
printf("文件读取成功");
fclose(fp);
return head;
}
//菜单
int main(){
struct staff*m;
int n=0,count;
int option=1;
while(option<=8&&option>=1)
{
printf("\n------职工信息管理系统------\n\n");
printf("------1.录入信息 ------\n");
printf("------2.浏览信息 ------\n");
printf("------3.按工资排序----\n");
printf("------4.按工资查询--\n");
printf("------5.修改信息 ------\n");
printf("------6.删除信息 ------\n");
printf("------7.保存至文件------\n");
printf("------8.读取文件------\n");
printf("------9.删除文本所有职工信息------\n");
printf("------0. 退出 ------\n");
printf("------------------------\n");
printf("输入选项:");
scanf("%d",&option);
switch(option)
{
case 1:
{
system("cls");
input();
break;
}
case 2:
{
system("cls");
output();
break;
}
case 3:
{
system("cls");
sort();
sort();
printf("排序完成\n");
break;
}
case 4:
{
system("cls");
int salary;
printf("输入要查找职工的工资:");
scanf("%d",&salary);
int index=outputone(salary);
if(index==-1)
{
printf("查找失败\n");
}
else
{
printf("查找成功\n");
}
break;
}
case 5:
{
modify();
break;
}
case 6:
{
del();
system("cls");
break;
}
case 7:
{
system("cls");
save();
break;
}
case 8:{
head=read(head1);
break;
}
case 9:{
FILE* fp;
fp = fopen("职工信息管理系统.txt", "w");
fclose(fp);
printf("已经删除所有职工信息");
break;
}
case 0: break;
if(option==0)break;
}
if(option==0)break;
}
}
功能:
1.录入信息
2.浏览信息
3.按工资排序
4.按工资查询
5.修改信息
6.删除信息
7.保存至文件
8.读取文件
9.删除文本所有职工信息
0. 退出