资源描述
/C语言课程设计职工信息管理系统一单链表实现 ttinclude stdio. httinclude stdlib. httinclude string, hint saveflag=O;/*是否需要存盘的标志变量*/struct employeechar name15;char num 10 ;/* 工号 */char sex4;char bm15;char zc 20;int gz:;typedef struet nodestruet employee data; struet node *next;Node, *Link;/Link 1 (注意是:字母1不是数字1)void add (Link 1);void disp(Link 1) ;/查看职工所有信息void del (Link 1);删除功能Node* Locate(Link 1, char findmess, char nameornumEl);void Qur (Link 1); void Tongji(Link 1);void Sort(Link 1):void Modify(Link 1);void save (Link 1): void printe(Node *p);/查询功能/统计/排序/修改功能将单链表1中的数据写入文件本函数用于打印链表中某个节点的数据内容*/ 以下4个函数用于输出中文标题 void printstart();void Wrong ();void Nofind ();void printc ();void menu ()*n)printf(t*n); printf(t*职工信息管理系统结构体数组实现*);printf(t*);printf(t*11增加职工信息2删除职工信息*n);printf(t*3查询职工信息4修改职工信息*n);printf(t*5插入职工记录6统计职工记录*n);printf(t*7排序8保存职工信息*n);printf(t*9显示数据0退出系统*);pri ntf (t *);, : 1 1 1 1 1 1 1 1 1 1 1 1 I I I*n) /void menu菜单结束void Disp(Link 1)/显小单链表1中存储的职工记录,内容为employee结构中定义的内容int count二0;Node *p;P=l-next;/ 1存储的是单链表中头结点的指针,该头结点没有存储职工信息,指针域指向的后继结点才有职工信息if(!p) /*p=NULL, NU11 在 stdlib 中定义为 0*/printf (/zn=提示:没有职工记录可以显示! n); return;printf (zztttt 显示结果n);printstart () ;/打印横线printc ();打印各学科标题printf(n);while (p)/逐条输出链表中存储的职工信息printe(p);p=p-next;pri nt start ();printf(n); /void Disp 结束void printstart()printf (n);void Wrong ()printf (n二=提示:输入错误! n);void Nofind ()printf Cn=提示:没有找到该职工! n);void printc () /*本函数用于输出中文*/printf(工号t姓名性别部门职称工资总工资平均工资n);void printe(Node *p)/*本函数用于打印链表中某个节点的数据内容*/printf (/z%-12s%st%st%dt%dt%dt %dt %dn,p-data. num, p-data. name, p-data. sex, p-data. bm, p-data. zc, p-dat a. gz);/Locate(1, findmess, num);/*该函数用于定位连表中符合要求的结点,并返回该指针*/Node* Locate(Link 1, char findmess, char zcornum)Node *r;if (strcmp (zcornum, num) =0) /* 按工号查询 */r=lnext;while (r!=NULL)if (strcmp (i-data, num, findmess) =0) /*若找到 findmess 值的工 号*/return r;r=rnext;else if (strcmp (zcornum,,zc,)=0) /* 按职称查询 */r=lnext;while (r!=NULL)if (strcmp (rdata. zc, findmess) =0)/*若找到 findmess 值的职工职称*/return r;r=rnext;return 0;/*若未找到,返回一个空指针*/add()函数中,无节点时,r指向list头,有节点时,r指向末尾节点void Add (Link 1) /* 增加职工 */Node *p,*r,*s; /*实现添加操作的临时的结构体指针变量*/char num10;int flag=0;r=l;s=l-next: /链表没有节点时,s=null;/链表有节点时,指向第一个职工 节点while(r-next!=NULL) /如果存在后继结点时,r指针后移一个 r=r-next; /*将指针移至于链表最末尾,准备添加记录*/while (1) printf (请你输入工号(以0返回上一级菜单:); scanfnum);if (strcmp (num,,0,)=0) 输入O,跳出 while (1), B|J 跳出 add ()函 数break;s=l-next; /作用?每次从第一个节点开始找,看num是否重复。while (s) /工号重复时,返回主菜单if(strcmp(sdata. num, num)=O)printf (=提示:工号为s的职工己经存在,若要修改请 你选择4修改! n, num);flag=l; /break;return ;s=snext; /while(s)p= (Node *)malloc (sizeof (Node) ; /生成没赋值的新节点 p strcpy (p-data. num, num);printf (请你输入姓名:);scanfp-data. name);get char ();printf (请你输入性别:);scanf (,z%sz,, p-data. sex);get char ();printf (请你输入职工所在部门:);scanf (滋d, &p-data bm);get char ();printf (/z请你输入职工职称:);scanf (滋d, &p-data zc);get char ();printf (请你输入职工工资:);scanf (滋d, &p-data gz);get char ();/*信息输入已经完成*/p-next二NULL; /*表明这是链表的尾部结点*/r=P;saveflag=l; /while(1) /void Add增加结束void Del (Link 1) /* 删除 */int sei;Node *p, *r;/*实现删除操作的临时的结构体指钊变量*/char findmess20;辻(!l-next) 当list无后继结点时,提示和结束返回del()printf (n二二二二二提示:没有记录可以删除! n);return;printf (n二二二二二1 按工号删除n二二二二二2 按姓名删除n);scanf&sei);辻(sel=l) /按工号删除printf (请你输入要删除的工号:);scanffindmess);p二Locate(l,findmess, num);if(P)r=l;while(r-next!二p)r=r-next; /从第一个结点找起,直到发现rnext=p,是待 删除结点,跳出循环rnext二p-next;/rrnext (p)p-nextfree(p);printf (n二=提示:该职工己经成功删除! n);saveflag二1;elseNofind () ; /显示一句话 /if (sel=l)else辻(sei二二2)/按姓名删除printf (请你输入要删除的姓名:);scanffindmess);p二Locate(l,findmess, name);if(P)r=l;while(r-next!二p)r=r-next;rnext二p-next:/r rnext(p) p-nextfree(p);printf (z/n=提示:该职工已经成功删除! n); saveflag=l;elseNofind (); /if (sel=2)elseWrong() ; /显示输入错误的话 /void Del删除结束void Qur (Link 1)/查询功能int sei;char findmess20:Node *p;/实现查询操作的临时的结构体指针变量if(!l-next)printf (n二=提示:没有资料可以查询! n); return;printf (,n=l 按工号查找n=2 按职称查找n); scanf&sei);if(sel=l)/* 工号 */printf (“请你输入要查找的工号:);scanffindmess);p二Locate(l, findmess, num);if(P)printf Ctttt 查找结果n);printstart () :/打印横线printc ();/打印各学科标题printe (p) :/打印p结点各个数据成员的值printstart () ;/打印横线elseNofind ();/辻(sel=l)else if (sel=2) /* 职称 */printf (请你输入要查找的职称:);scanffindmess);p二Locate(l, findmess, zc);if(P)printf Ctttt 查找结果n);prints tart ();printc ();printe (p);prints tart ();elseNofind ();elseWrong (); /void Qur查询结束void Modify (Link 1)/修改功能Node *p;char findmess20:if (!lnext)printf (n二=提示:没有资料可以修改! n); return;printf (请你输入要修改的职工工号:); scanffindmess);p二Locate(l, findmess, num);辻(p)printf (请你输入新工号(原來是蜒):,p-data. num); scanfp-data. num);printf (”请你输入新姓夕i (原來是s) :, p-data. name); scanf (,%s, p-data. name);getchar ();printf (请你输入新性别(原來是蜒):”,p-data. sex); scanf (,z%sz,, p-data sex);getchar ();printf (请你输入新的部门(原來是s) : p-data. bm); scanf (,z%d,z, &p-data bm);printf C请你输入新的职称(原來是s) :, p-data, zc); scanf (,z%d,z, &p-data zc);getchar ();printf (请你输入新的工资(原來是%d) : ”, p-data. gz); scanf (,z%d,z, &p-data gz);printf (z,n=提示:资料修改成功! n);/shoudsave=l;elseNofind () ; /if (p)结束 /void Modify (Link 1)/修改功能结束/插入记录:按工号查询到要插入的节点的位置,然后在该工号之后插入一个新 节点。void Insert(Link 1)Node *s, *r, *p; /*p指向插入位置,p指新插入记录节点*/char ch, new_num10, old_num10;/old_num存插入点囲之前的工号,new_num保存输入的新记录 的工号int flag=0;s=lnext; system(cis); Disp(l);while (1)/stringinput(s,10, please input insert location after the Number;printf(/z请你输入己存在的工号(以O返回上一级菜单:);scanf (,%s/z, old_num);if (strcmp (old_num, 0)二二 0) /输入O,跳出 while (1),即跳出 Insert ()函数return;s=l-next; /作用?每次从第一个节点开始找flag=O;while (s) /*查询该工号是否存在,flag=l表示该工号存在*/if(strcmp(sdata. num, old_num)=0) -flag=l;break;s=snext;if(flag=l)break; /*若工号存在,则进行插入之前的新记录的输入操作*/elsegetchar ();printf (,n=The number %s is not existing, try again? (y/n):, old_num);scanf&ch);if (ch 二二y,| | ch 二二Y)continue;elsereturn; 回主菜单/while(1)/*以下新记录的插入新节点,工号不能跟已存在的工号相同,操作与Add() 相同*/printf(请你输入待插入的工号(以0返回上一级菜单:); scanf (,z%sA new_num);if (strcmp (new_num, 0)=0)/输入O,跳出 while (1),即跳出 add ()函数一return;s=l-next; /作用?每次从第一个节点开始找,看num是否重复。while(s) /工号重复时,返回主菜单if (strcmp (sdata. num, new_num) =0) _printf (=提示:工号为s的职工己经存在 ! n, new_num);flag=l;return ;s二s-next; /while(s)p=(Node *)malloc(sizeof(Node);if(!p)printf(z,n allocate memory failure “); /*如没有申请到,打印 提不信息*/return ;/*返回主界面*/strcpy(p-data num, new_num); printf (“请你输入姓名: scanfp-data. name); getchar ();printf (“请你输入性别:);scanfp-data. sex);getchar ();printf (”请你输入部门:);scanf&p-data bm);getchar ();printf (“请你输入职称:);scanf&p-data zc);getchar ();printf(请你输入工资:); scanf&p-data gz); getchar ();/信息输入己经完成p-next二NULL;/*表明这是链表的尾部结点*/saveflag二1; /*在main()有对该全局变量的判断,若为1,则进行存盘操 作*/*将指针赋值给r,因为1中的头节点的下一个节点才实际保存着学生的 记录*/r二1一next;while (1)if (strcmp (rdata. num, old_num) =0) /*在链表中插入一个节点*/ _p-next=r-next;r一next二p;break;r二r一next;/ whiled) , r作为查询指针,依次从第一个节点找起,找到后跳 出while (1)循环Disp(l);printf(nn);/ getchar ();void Tongji (Link 1)/统计Node *max, *min;/*用于指向工资最高的节点*/Node *t二1-next;if(!t)system(cls);printf(n二二二二二Not employee record!n); getchar ();return;system(cls);Disp(l); max=min=t; while(t)if (t-data. gz二max-data. gz)max=t;if (t-data. gzdata. gz)min=t;t二tnext;printf (最高工资为:%dn, max);printf(t%st%st%st%st%st%dnn, t-data. num, t-data. name, tdat a. sex, tdata. bm, t-data. zc, t-data. gz);printf C最低工资为:%dn, min);printf(t%st%st%st%st%st%dnn, t-data. num, t-data. name, tdat a. sex, tdata. bm, t-data. zc, t-data. gz);void Sort (Link 1)/排序Link 11:Node *p, *ir, *s;int i=0;辻(l-next=NULL) system(,zcls/z);printf(n二二二二二Not employee record!n);getchar ();return ;11= (Node*)malloc (sizeof (Node) ; /*用于创建新的节点*/辻(!11)printf(z,n allocate memory failure “); /*如没有申请到,打印 提不信息*/return ;/*返回主界面*/11-next二NULL;system(cis);Disp(l) ;/*显示排序前的所有职工记录*/p二1一next;while(p) /*p!二NULL*/s=(Node*)malloc (sizeof (Node) ; /*新建节点用于保存从原链表中 取出的节点信息*/if(!s) /*s二二NULL*/printf(z/n allocate memory failure “); /*如没有申请到, 打印提示信息*/return ;/*返回主界面*/s-data=p-data; /*填数据域*/ s-next=NULL;/* 指针域为空 */rr=ll;/紅r链表于存储插入单个节点后保持排序的链表,11是这个链表的 头指针,每次从头开始查找插入位置*/while(rrnext!二NULL & rrnext-data. gz=p-data. gz) rr=rr-next; /*指针移至总分比p所指的节点的总分小的节点位 置*/if(rr-next=NULL)/*若新链表11中的所有节点的总分值都比 p-data.gz大时,就将p所指节点加入链表尾部*/rrnext=s;else /*否则将该节点插入至第一个总分字段比它小的节点的前面*/ s-next二rr-next; rrnext=s;p=p-next; /*原链表中的指针下移一个节点*/l-next=ll-next; All中存储是的已排序的链表的头指针*/Disp(l);saveflag=l;printf (n=sort complete! n,z);void Save(Link 1)FILE* fp;Node *p;/实现保存操作的临时的结构体指针变量int flag二1, count二0;fp二fopen(employee, txt, wb);辻(fp=NULL)printf (n二=提示:重新打开文件时发生错误! n);return;p=l-next; /p指向第一个记录结点while(p)if (fwrite (p, sizeof (Node), 1, fp)=l) /将第一个记录结点值写 入文件p=p-next;/依次写入第二个结点的值,count+;/文件的记录数+1elseflag=0; break; /while(p)辻(count0)Printf(/Zn=提示:文件保存成功.(有d条记录己经保 存.)n, count);saveflag=0;elsesystem(cls);printf(/z保存文件失败,O条记录被保存! n);fclose(fp); / void Save 结束void main ()Link list: /*定义链表*/ / struct node *list;FILE *fp; /*文件指针*/int choose; /*保存选择结果变量*/ char ch; /*保存(y, Y, n, N)*/int count=0; /*保存文件中的记录条数(或结点个数)*/ struct node *p, *r;/*定义记录指针变量*/printf (,ztttt 职工信息管理系统nttttn);list=(struet node*)malloc(sizeof(struet node):if (!list)printf(z,n allocate memory failure “); /*如没有申请到,打印 提不信息*/return ;/*返回主界面*/list-next=NULL;r=list;fp二fopen(employee, txt, rb);if(fp=NULL)printf(/zn=提示:文件还不存在,是否创建?(y/n)n); scanf&ch);if (ch=,y,| | ch=,Y,)fp二fopen(employee . txt,ab+);elseexit (0); / if(fp二二NULL)printf (,zn=提示:文件己经打开,正在导入记录n);while(!feof(fp) /没有到文件尾时,循环p二(struet node*)malloc(sizeof(struet node);if(!p)printf ( memory malloc failure! n,z) ;/*没有申请成功*/exit (0) ;/*退出*/if (fread (p, sizeof (struct node), 1, fp) /* 读文件的己有内容放 入结点中*/p-next二NULL; rnext二p;r二p; /*将该结点挂入链表中,r指向最后的节点*/ count+; /while(!feof(fp) fclose (fp) : /* 关闭文件 */printf (n=二二二提示:记录导入完毕,共导入%d条记录n,z, count);while (1)menu ();printf (/ztt=请选择:”);scanf (,z%d,z, &choose);if (choose二二0)if (saveflag=l)get char ();printf (/zn=提示:资料己经改动,是否将改动保存到文 件中(y/n)?nO ;scanf&ch);if (ch 二二y,| | ch 二二Y)Save (list); /辻printf (z/n=提示:你己经退出系统,再见!n); break;/ifswitch(choose)case 1:Add(list);break; /*增加职工记录*/case 2:Del(list);break;/*删除职工记录*/case 3:Qur(list);break;/*查询职工记录*/case 4:Modify(list);break;/*修改职工记录*/ case 5:Insert(list);break;/*插入职工记录*/ case 6:Tongji (list);break; /*统计职工记录*/ case 7:Sort (list);break;/*排序职工记录*/ case 8:Save(list);break;/*保存职工记录*/ case 9:system(cls);Disp (list);break;/*显示职工记录*/default:Wrong ();getchar ();break; /switch(choose)/while(l) /main()/* */
展开阅读全文