//要求用C语言完成课程设计职工信息管理系统—单链表实现#include <stdio.h>#include <stdlib.h>#include <string.h>int saveflag=0; /*是否需要存盘的标志变量*/struct employee{char name[15];char num[10];/* 工号 */char sex[4];char bm[15];char zc[20];int gz;};typedef struct node{struct employee data;struct node *next;}Node,*Link;//Link l (注意是:字母l不是数字1)void add(Link l);void disp(Link l); //查看职工所有信息void del(Link l); //删除功能Node* Locate(Link l,char findmess[],char nameornum[]);void Qur(Link l); //查询功能void Tongji(Link l); //统计void Sort(Link l); //排序void Modify(Link l); //修改功能void save(Link l); //将单链表l中的数据写入文件void printe(Node *p); //本函数用于打印链表中某个节点的数据内容 *///以下4个函数用于输出中文标题void printstart();void Wrong();void Nofind();void printc();void menu(){printf("\t*****************************************************************\n");printf("\t* *\n");printf("\t* 职工信息管理系统_结构体数组实现*\n");printf("\t* *\n")printf("\t* [1] 增加职工信息 [2] 删除职工信息 *\n");printf("\t* [3] 查询职工信息 [4] 修改职工信息 *\n");printf("\t* [5] 插入职工记录 [6] 统计职工记录 *\n");printf("\t* [7] 排序 [8] 保存职工信息 *\n");printf("\t* [9] 显示数据 [0] 退出系统*\n");printf("\t* *\n");printf("\t*****************************************************************\n");} //void menu菜单结束void Disp(Link l) //显示单链表l中存储的职工记录,内容为employee结构中定义的内容{int count=0;Node *p;p=l->next; // l存储的是单链表中头结点的指针,该头结点没有存储职工信息,指针域指向的后继结点才有职工信息if(!p) /*p==NULL,NUll在stdlib中定义为0*/{printf("\n=====>提示:没有职工记录可以显示!\n");return;}printf("\t\t\t\t显示结果\n");printstart(); //打印横线printc(); //打印各学科标题printf("\n");while(p) //逐条输出链表中存储的职工信息{printe(p);p=p->next;}printstart();printf("\n");} //void Disp结束void printstart(){printf("-----------------------------------------------------------------------\n");}void Wrong(){printf("\n=====>提示:输入错误!\n");}void Nofind(){printf("\n=====>提示:没有找到该职工!\n");}void printc() /* 本函数用于输出中文 */{printf(" 工号\t 姓名性别部门职称工资总工资平均工资\n"); }void printe(Node *p)/* 本函数用于打印链表中某个节点的数据内容 */ {printf("%-12s%s\t%s\t%d\t%d\t%d\t %d\t %d\n",p->data.num,p->,p->data.sex,p->data.bm,p->data.zc,p->dat a.gz);}//Locate(l,findmess,"num");/* 该函数用于定位连表中符合要求的结点,并返回该指针 */Node* Locate(Link l,char findmess[],char zcornum[]){Node *r;if(strcmp(zcornum,"num")==0) /* 按工号查询 */{r=l->next;while(r!=NULL){if(strcmp(r->data.num,findmess)==0) /*若找到findmess值的工号*/return r;r=r->next;}}else if(strcmp(zcornum,"zc")==0) /* 按职称查询 */{r=l->next;while(r!=NULL){if(strcmp(r->data.zc,findmess)==0) /*若找到findmess值的职工职称*/return r;r=r->next;}}return 0; /*若未找到,返回一个空指针*/}//add()函数中,无节点时,r指向list头,有节点时,r指向末尾节点void Add(Link l) /* 增加职工 */{Node *p,*r,*s; /*实现添加操作的临时的结构体指针变量*/char num[10];int flag=0;r=l;s=l->next; //链表没有节点时,s=null;/链表有节点时,指向第一个职工节点while(r->next!=NULL) //如果存在后继结点时,r指针后移一个r=r->next; /*将指针移至于链表最末尾,准备添加记录*/while(1){printf("请你输入工号(以'0'返回上一级菜单:)");scanf("%s",num);if(strcmp(num,"0")==0) //输入'0',跳出while(1),即跳出add()函数break;s=l->next; //作用?每次从第一个节点开始找,看num是否重复。
while(s) //工号重复时,返回主菜单{if(strcmp(s->data.num,num)==0){printf("=====>提示:工号为'%s'的职工已经存在,若要修改请你选择'4 修改'!\n",num);flag=1;//break;return ;}s=s->next;} //while(s)p=(Node *)malloc(sizeof(Node)); //生成没赋值的新节点 pstrcpy(p->data.num,num);printf("请你输入姓名:");scanf("%s",p->);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; /*表明这是链表的尾部结点*/r->next=p; /*将新建的结点加入链表尾部中*/r=p;saveflag=1;} //while(1)} //void Add增加结束void Del(Link l) /* 删除 */{int sel;Node *p,*r; /*实现删除操作的临时的结构体指针变量*/char findmess[20];if(!l->next) //当list无后继结点时,提示和结束返回del(){printf("\n=====>提示:没有记录可以删除!\n");return;}printf("\n=====>1按工号删除\n=====>2按姓名删除\n");scanf("%d",&sel);if(sel==1) //按工号删除{printf("请你输入要删除的工号:");scanf("%s",findmess);p=Locate(l,findmess,"num");if(p){r=l;while(r->next!=p)r=r->next; //从第一个结点找起,直到发现r->next=p, 是待删除结点,跳出循环r->next=p->next; //r r->next(p) p->nextfree(p);printf("\n=====>提示:该职工已经成功删除!\n");saveflag=1;}elseNofind(); //显示一句话} //if(sel==1)else if(sel==2) //按姓名删除{printf("请你输入要删除的姓名:");scanf("%s",findmess);p=Locate(l,findmess,"name");if(p){r=l;while(r->next!=p)r=r->next;r->next=p->next; //r r->next(p) p->nextfree(p);printf("\n=====>提示:该职工已经成功删除!\n");saveflag=1;}elseNofind();} //if(sel==2)elseWrong(); //显示输入错误的话} //void Del删除结束void Qur(Link l) //查询功能{int sel;char findmess[20];Node *p; //实现查询操作的临时的结构体指针变量if(!l->next){printf("\n=====>提示:没有资料可以查询!\n");return;}printf("\n=====>1按工号查找\n=====>2按职称查找\n");scanf("%d",&sel);if(sel==1)/* 工号 */{printf("请你输入要查找的工号:");scanf("%s",findmess);p=Locate(l,findmess,"num");if(p){printf("\t\t\t\t查找结果\n");printstart(); //打印横线printc(); //打印各学科标题printe(p); //打印p结点各个数据成员的值printstart(); //打印横线}elseNofind();} //if(sel==1)else if(sel==2) /* 职称 */{printf("请你输入要查找的职称:");scanf("%s",findmess);p=Locate(l,findmess,"zc");if(p){printf("\t\t\t\t查找结果\n");printstart();printc();printe(p);printstart();}elseNofind();}elseWrong();} //void Qur查询结束void Modify(Link l) //修改功能{Node *p;char findmess[20];if(!l->next){printf("\n=====>提示:没有资料可以修改!\n");return;}printf("请你输入要修改的职工工号:");scanf("%s",findmess);p=Locate(l,findmess,"num");if(p){printf("请你输入新工号(原来是%s):",p->data.num);scanf("%s",p->data.num);printf("请你输入新姓名(原来是%s):",p->);scanf("%s",p->);getchar();printf("请你输入新性别(原来是%s):",p->data.sex);scanf("%s",p->data.sex);getchar();printf("请你输入新的部门(原来是%s):",p->data.bm);scanf("%d",&p->data.bm);printf("请你输入新的职称(原来是%s):",p->data.zc);scanf("%d",&p->data.zc);getchar();printf("请你输入新的工资(原来是%d):",p->data.gz);scanf("%d",&p->data.gz);printf("\n=====>提示:资料修改成功!\n");//shoudsave=1;}elseNofind(); //if(p)结束} //void Modify(Link l) //修改功能结束//插入记录:按工号查询到要插入的节点的位置,然后在该工号之后插入一个新节点。