#include<stdio.h>
#include<conio.h>
#include<malloc.h>
#include<string.h>
typedef struct ZHIGONG
{
char zhigongNumber[10];/*職工號*/
char zhigongName[20];/*職工姓名*/
char zhigongsex[4]; /*職工性別*/
char zhigongage[10]; /*出生年月*/
char zhigongedu[10];/*學歷*/
char zhigongposition[30]; /*職務*/
char zhigongwage[1000]; /*工資*/
struct ZHIGONG *next;
}ZHIGONG;
ZHIGONG *headLink;/*鏈表表頭指針*/
/*以下是函數聲明*/
void ReadInfoFormFile(void);
void DesplayMenu(void);
void CreateHeadLink(void);
ZHIGONG *MallocNode(void);
void GetInformation(ZHIGONG *t);
void InsertOneNode(ZHIGONG *t);
void DesplayInfoByzhigongwage(void);
void DesplayInfoByezhigongedu(void);
void DesplayOneNode(ZHIGONG *t);
void DeleteNodeByzhigongNumber(void);
void OutputInformation(void);
void ChangeMarkByzhigongName(void);
void CompositorByTotalzhigongwage(void);
void CompositorByTotalzhigongedu(void);
void SaveLinkToFile(void);
int choose;/*用於接受用戶的選擇*/
/*主函數*/
void main()
{
CreateHeadLink();
ReadInfoFormFile();
DesplayMenu();
SaveLinkToFile();
}
/************************************
函數功能:從文件中讀職工信息到鏈表中
************************************/
void ReadInfoFormFile(void)
{
FILE *fp;
ZHIGONG *p;
fp=fopen("zhigong.txt","r");
if(!fp)
{
printf("文件不存在\n");
return;
}
p=MallocNode();
while(fscanf(fp,"%s%s%s%s%s%s%s",p->zhigongNumber,p->zhigongName,p->zhigongsex,
p->zhigongage,p->zhigongedu,p->zhigongposition,p->zhigongwage))
{
InsertOneNode(p);
p=MallocNode();
}
fclose(fp);
}
/************************************
函數功能:顯示菜單,根據用戶的輸入
完成相應的功能
************************************/
void DesplayMenu(void)
{
ZHIGONG *p;
printf("-------請選擇相應功能------------\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\n");
scanf("%d",&choose);/*取得用戶的選擇*/
switch(choose)
{
case 1:
p=MallocNode();/*先申請壹個新結點*/
GetInformation(p);/*要求用戶輸入信息到新結點中*/
InsertOneNode(p);/*將新結點加到鏈表中*/
break;
case 2:
OutputInformation();/*顯示所有職工的信息*/
break;
case 3:
DesplayInfoByzhigongwage();/*根據用戶輸入的職工工資顯示該職工的信息*/
break;
case 4:
DesplayInfoByezhigongedu(); /*根據用戶輸入的職工學歷顯示該職工的信息*/
break;
case 5:
CompositorByTotalzhigongwage();/* 按工資排序*/
break;
case 6:
CompositorByTotalzhigongedu();/* 按學歷排序*/
break;
case 7:
DeleteNodeByzhigongNumber();/*根據用戶輸入的職工號刪除該職工信息*/
break;
case 8:
ChangeMarkByzhigongName();/*根據用戶輸入的職工姓名修改該職工信息*/
break;
case 9:
SaveLinkToFile();/*保存數據後再退出*/
free(headLink);
default:
break;
}
DesplayMenu();/*遞歸調用*/
}
/************************************
函數功能:建立鏈表表頭
************************************/
void CreateHeadLink(void)
{
ZHIGONG *p;
p=(ZHIGONG*)malloc(sizeof(ZHIGONG));
headLink=p;
p->next=NULL;
}
/****************************************
函數功能:申請壹個新結點,並將其初始化
*****************************************/
ZHIGONG *MallocNode(void)
{
ZHIGONG *p;
int i;
p=(ZHIGONG*)malloc(sizeof(ZHIGONG));
if(p==NULL)
return NULL;
for(i=0;i<10;i++)
p->zhigongNumber[i]='\0';
for(i=0;i<20;i++)
p->zhigongName[i]='\0';
for(i=0;i<4;i++)
p->zhigongsex[i]='\0';
for(i=0;i<10;i++)
p->zhigongage[i]='\0';
for(i=0;i<10;i++)
p->zhigongedu[i]='\0';
for(i=0;i<30;i++)
p->zhigongposition[i]='\0';
for(i=0;i<1000;i++)
p->zhigongwage[i]='\0';
p->next=NULL;
return p;
}
/************************************
函數功能:取得用戶輸入的職工信息
************************************/
void GetInformation(ZHIGONG *t)
{
printf("請輸入職工號:\n");
scanf("%s",t->zhigongNumber);
printf("請輸入職工姓名:\n");
scanf("%s",t->zhigongName);
printf("請輸入職工性別:\n");
scanf("%s",t->zhigongsex);
printf("請輸入職工出生年月:\n");
scanf("%s",t->zhigongage);
printf("請輸入職工學歷:\n");
scanf("%s",t->zhigongedu);
printf("請輸入職工職位:\n");
scanf("%s",t->zhigongposition);
printf("請輸入職工工資:\n");
scanf("%s",t->zhigongwage);
}
/************************************
函數功能:在鏈表的結尾處增加壹個結點
************************************/
void InsertOneNode(ZHIGONG *t)
{
ZHIGONG *p;
p=headLink;
while(p->next)
{
p=p->next;
}
p->next=t;
}
/*************************************************
函數功能:根據用戶輸入的職工工資顯示該職工的信息
**************************************************/
void DesplayInfoByzhigongwage(void)
{
ZHIGONG *p;
char zhigongwage[1000];
char flag=0;
p=headLink->next;
printf("請輸入職工的工資:\n");
scanf("%s",zhigongwage);
while(p)
{
if(strcmp(p->zhigongwage,zhigongwage)==0)
{
printf("職工號\t姓名\t性別\t出生年月\t學歷\t職務\t工資\n\n");
DesplayOneNode(p);
flag=1;
break;
}
p=p->next;
}
if(!flag)
printf("對不起,不存在工資為%s的職工\n",zhigongwage);
}
/************************************************
函數功能:根據用戶輸入的職工學歷顯示該職工的信息
*************************************************/
void DesplayInfoByezhigongedu(void)
{
ZHIGONG *p;
char zhigongedu[10];
char flag=0;
p=headLink->next;
printf("請輸入職工學歷:\n");
scanf("%s",zhigongedu);
while(p)
{
if(strcmp(p->zhigongedu,zhigongedu)==0)
{
printf("職工號\t姓名\t性別\t出生年月\t學歷\t職務\t工資\n\n");
DesplayOneNode(p);
flag=1;
break;
}
p=p->next;
}
if(!flag)
printf("對不起,不存在學歷為 %s 的職工\n",zhigongedu);
}
/************************************
函數功能:輸出壹個結點的信息
************************************/
void DesplayOneNode(ZHIGONG *t)
{
printf("%s\t",t->zhigongNumber);
printf("%s\t",t->zhigongName);
printf("%s\t",t->zhigongsex);
printf("%s\t",t->zhigongage);
printf("%s\t",t->zhigongedu);
printf("%s\t",t->zhigongposition);
printf("%s\t\n",t->zhigongwage);
}
/*************************************************
函數功能:根據用戶輸入的職工號刪除該職工的信息
**************************************************/
void DeleteNodeByzhigongNumber(void)
{
char zhigongNumber[10];
ZHIGONG *p,*q;
char flag=0;
printf("請輸入要刪除的職工的職工號:");
scanf("%s",zhigongNumber);
p=headLink;
q=headLink->next;
while(q)
{
if(strcmp(q->zhigongNumber,zhigongNumber)==0)
{
p->next=q->next;
free(q);
flag=1;
break;
}
p=p->next;
q=q->next;
}
if(!flag)
{
printf("不存在該職工號的職工\n");
return;
}
printf("成功刪除\n");
}
/************************************
函數功能:顯示所有職工的信息
************************************/
void OutputInformation(void)
{
ZHIGONG *p;
p=headLink->next;
if(p==NULL)
{
printf("現在沒有職工信息,請先輸入職工信息\n\n");
return;
}
printf("職工號\t姓名\t性別\t出生年月\t學歷\t職務\t工資\n\n");
while(p)
{
DesplayOneNode(p);
p=p->next;
}
}
/*********************************************
函數功能:根據輸入的職工姓名修改員工的信息
**********************************************/
void ChangeMarkByzhigongName(void)
{
ZHIGONG *p;
char zhigongName[10];
char flag=0;
char zhigongedu,zhigongwage,zhigongage,zhigongNumber,zhigongsex,zhigongposition;
p=headLink->next;
printf("請輸入職工姓名:\n");
scanf("%s",zhigongName);
while(p)
{
if(strcmp(p->zhigongName,zhigongName)==0)
{
printf("請輸入新的職工號:\n");
scanf("%s",&zhigongNumber);
printf("請輸入新的學歷:\n");
scanf("%s",&zhigongedu);
printf("請輸入新的工資:\n");
scanf("%s",&zhigongwage);
printf("請輸入新的出生年月:\n");
scanf("%s",&zhigongage);
printf("請輸入新的性別:\n");
scanf("%s",&zhigongsex);
printf("請輸入新的職位:\n");
scanf("%s",&zhigongposition);
strcpy(p->zhigongposition,&zhigongposition);
strcpy(p->zhigongsex,&zhigongsex);
strcpy(p->zhigongNumber,&zhigongNumber);
strcpy(p->zhigongedu,&zhigongedu);
strcpy(p->zhigongwage,&zhigongwage);
strcpy(p->zhigongage,&zhigongage);
flag=1;
printf("修改成功\n");
break;
}
p=p->next;
}
if(!flag)
printf("對不起,不存在姓名為 %s 的職工\n",zhigongName);
}
/************************************
函數功能:保存鏈表數據到文件中
************************************/
void SaveLinkToFile(void)
{
ZHIGONG *p;
FILE *fp;
p=headLink->next;
if(p==NULL)
{
printf("現在沒有職工信息,請先輸入職工信息\n\n");
return;
}
fp=fopen("zhigong.txt","w+");
if(!fp)
{
printf("文件不存在\n");
return;
}
while(p)
{
fprintf(fp,"%s%s%s%s%s%s%s",p->zhigongNumber,p->zhigongName,p->zhigongsex,
p->zhigongage,p->zhigongedu,p->zhigongposition,p->zhigongwage);
p=p->next;
}
fclose(fp);
}
/************************************
函數功能:按職工工資排序
************************************/
void CompositorByTotalzhigongwage(void)
{
ZHIGONG exchange,*r,*p,*q;
r=headLink->next;
if(r==NULL)
{
printf("現在還沒職工信息,請先輸入職工信息\n");
return;
}
while(r)/*兩層while循環實現排序*/
{
p=r;
q=r->next;
while(q)
{
if((p->zhigongwage)>(p->zhigongwage))
{
strcpy(exchange.zhigongNumber,q->zhigongNumber);/*先復制q結點信息到exchange*/
strcpy(exchange.zhigongName,q->zhigongName);
strcpy(exchange.zhigongsex,q->zhigongsex);
strcpy(exchange.zhigongage,q->zhigongage);
strcpy(exchange.zhigongedu,q->zhigongedu);
strcpy(exchange.zhigongposition,q->zhigongposition);
strcpy(exchange.zhigongwage,q->zhigongwage);
strcpy(q->zhigongNumber,p->zhigongNumber);/*再復制p結點信息到q*/
strcpy(q->zhigongName,p->zhigongName);
strcpy(q->zhigongsex,p->zhigongsex);
strcpy(q->zhigongage,p->zhigongage);
strcpy(q->zhigongedu,p->zhigongedu);
strcpy(q->zhigongposition,p->zhigongposition);
strcpy(q->zhigongwage,p->zhigongwage);
strcpy(p->zhigongNumber,exchange.zhigongNumber);/*最後復制exchange結點信息到p*/
strcpy(p->zhigongName,exchange.zhigongName);
strcpy(p->zhigongsex,exchange.zhigongsex);
strcpy(p->zhigongage,exchange.zhigongage);
strcpy(p->zhigongedu,exchange.zhigongedu);
strcpy(p->zhigongposition,exchange.zhigongposition);
strcpy(p->zhigongwage,exchange.zhigongwage);
}
q=q->next;
}
r=r->next;
}
OutputInformation();
}
/************************************
函數功能:按職工學歷排序
************************************/
void CompositorByTotalzhigongedu(void)
{
ZHIGONG exchange,*r,*p,*q;
r=headLink->next;
if(r==NULL)
{
printf("現在還沒職工信息,請先輸入職工信息\n");
return;
}
while(r)/*兩層while循環實現排序*/
{
p=r;
q=r->next;
while(q)
{
if((q->zhigongedu)>(p->zhigongedu))
{
strcpy(exchange.zhigongNumber,q->zhigongNumber);/*先復制q結點信息到exchange*/
strcpy(exchange.zhigongName,q->zhigongName);
strcpy(exchange.zhigongsex,q->zhigongsex);
strcpy(exchange.zhigongage,q->zhigongage);
strcpy(exchange.zhigongedu,q->zhigongedu);
strcpy(exchange.zhigongposition,q->zhigongposition);
strcpy(exchange.zhigongwage,q->zhigongwage);
strcpy(q->zhigongNumber,p->zhigongNumber);/*再復制p結點信息到q*/
strcpy(q->zhigongName,p->zhigongName);
strcpy(q->zhigongsex,p->zhigongsex);
strcpy(q->zhigongage,p->zhigongage);
strcpy(q->zhigongedu,p->zhigongedu);
strcpy(q->zhigongposition,p->zhigongposition);
strcpy(q->zhigongwage,p->zhigongwage);
strcpy(p->zhigongNumber,exchange.zhigongNumber);/*最後復制exchange結點信息到p*/
strcpy(p->zhigongName,exchange.zhigongName);
strcpy(p->zhigongsex,exchange.zhigongsex);
strcpy(p->zhigongage,exchange.zhigongage);
strcpy(p->zhigongedu,exchange.zhigongedu);
strcpy(p->zhigongposition,exchange.zhigongposition);
strcpy(p->zhigongwage,exchange.zhigongwage);
}
q=q->next;
}
r=r->next;
}
OutputInformation();
}
參考資料: