C语言课程设计 职工信息管理系统 单链表实现程序源代码

上传人:z**** 文档编号:110336531 上传时间:2022-06-18 格式:DOC 页数:17 大小:166KB
收藏 版权申诉 举报 下载
C语言课程设计 职工信息管理系统 单链表实现程序源代码_第1页
第1页 / 共17页
C语言课程设计 职工信息管理系统 单链表实现程序源代码_第2页
第2页 / 共17页
C语言课程设计 职工信息管理系统 单链表实现程序源代码_第3页
第3页 / 共17页
资源描述:

《C语言课程设计 职工信息管理系统 单链表实现程序源代码》由会员分享,可在线阅读,更多相关《C语言课程设计 职工信息管理系统 单链表实现程序源代码(17页珍藏版)》请在装配图网上搜索。

1、//C语言课程设计职工信息管理系统一单链表实现 ttinclude "stdio. h" ttinclude "stdlib. h" ttinclude "string, h" int saveflag=O; /*是否需要存盘的标志变量*/ struct employee { char name[15]; char num [10] ;/* 工号 */ char sex[4]; char bm[15]; char zc [20]; int gz: }; typedef struet node { struet employee data; struet node

2、*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(N

3、ode *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

4、] 删除职工 信息 *\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^

5、>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 (/z\n=====>提示:没有职工记录可以显示! \n〃); return; }

6、printf (zz\t\t\t\t 显示结果\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

7、 Nofind () { printf C\n=====>提示:没有找到该职工! \n〃); } void printc () /*本函数用于输出中文*/ { printf(〃工号\t姓名性别部门职称工资总工资平均工资\n〃); } void printe(Node *p)/*本函数用于打印链表中某个节点的数据内容*/ { printf (/z%-12s%s\t%s\t%d\t%d\t%d\t %d\t %d\n", p->data. num, p->data. name, p->data. sex, p->data. bm, p->data. zc, p->dat a.

8、 gz); //Locate(1, findmess, "num"); /*该函数用于定位连表中符合要求的结点,并返回该指针*/ Node* Locate(Link 1, char findmess[], char zcornum[]) { Node *r; if (strcmp (zcornum, ^num^) ==0) /* 按工号查询 */ { r=l~>next; while (r!=NULL) { if (strcmp (i'-〉data, num, findmess) ==0) /*若找到 findmess 值的工 号*/ return r; r=r~>n

9、ext; } } 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 1) /* 增加职工 */ { Node

10、 *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’返回上一级菜单:)〃); scanfnum); if (strcmp (num,,,0,,)==0) 〃输入'O',跳出 while (1), B|J 跳

11、出 add ()函 数 break; s=l->next; //作用?每次从第一个节点开始找,看num是否重复。 while (s) //工号重复时,返回主菜单 { if(strcmp(s~>data. num, num)==O) { printf (〃===>提示:工号为'%s'的职工己经存在,若要修改请 你选择'4修改’! \n", num); flag=l; //break; return ; } s=s~>next; } //while(s) p= (Node *)malloc (sizeof (Node)) ; //生成没赋值的新节点 p strcpy (p

12、->data. num, num); printf ("请你输入姓名:"); scanf p->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 (〃请你输入职工工资:〃);

13、 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 findmess[20]; 辻(!l->next) 〃当list无后继结点时,提示和结束返回del() { printf (〃\n二二二二二〉提示

14、:没有记录可以删除! \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; //从第一个结点找起,直到发现r~>next=p,是待 删除结点,跳出循环 r~>next二p->next; //r r~>next (p)

15、 p->next free(p); printf (〃\n二==>提示:该职工己经成功删除! \n〃); saveflag二1; } else Nofind () ; //显示一句话 } //if (sel==l) else辻(sei二二2) //按姓名删除 printf (〃请你输入要删除的姓名:〃); scanffindmess); 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->next

16、free(p); printf (z/\n=====>提示:该职工已经成功删除! \n〃); saveflag=l; } else Nofind (); } //if (sel=2) else Wrong() ; //显示输入错误的话 } //void Del删除结束 void Qur (Link 1) //查询功能 { int sei; char findmess[20]: Node *p; //实现查询操作的临时的结构体指针变量 if(!l->next) { printf (〃\n二==>提示:没有资料可以查询! \n〃); return; } prin

17、tf (,,\n=====>l 按工号查找\n=====>2 按职称查找\n〃); scanf&sei); if(sel==l)/* 工号 */ { printf (“请你输入要查找的工号:"); scanffindmess); p二Locate(l, findmess, "num"); if(P) { printf C\t\t\t\t 查找结果\n"); printstart () : //打印横线 printc (); //打印各学科标题 printe (p) : //打印p结点各个数据成员的值 printstart () ; //打印横线 } else No

18、find (); } //辻(sel==l) else if (sel==2) /* 职称 */ { printf (〃请你输入要查找的职称:"); scanffindmess); p二Locate(l, findmess, "zc"); if(P) { printf C\t\t\t\t 查找结果\n"); prints tart (); printc (); printe (p); prints tart (); } else Nofind (); } else Wrong (); } //void Qur查询结束 void Modify (Link

19、 1) //修改功能 { Node *p; char findmess[20]: if (!l~>next) { printf (〃\n二==>提示:没有资料可以修改! \n〃); return; } printf ("请你输入要修改的职工工号:〃); scanf findmess); p二Locate(l, findmess, "num"); 辻(p) { printf ("请你输入新工号(原來是蜒):",p->data. num); scanf p->data. num); printf (”请你输入新姓夕i (原來是%s) :", p->data. name);

20、 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 ("请你输

21、入新的工资(原來是%d) : ”, p->data. gz); scanf (,z%d,z, &p->data・ gz); printf (z,\n=====>提示:资料修改成功! \n"); //shoudsave=l; } else Nofind () ; //if (p)结束 } //void Modify (Link 1) //修改功能结束 //插入记录:按工号查询到要插入的节点的位置,然后在该工号之后插入一个新 节点。 void Insert(Link 1) { Node *s, *r, *p; /*p指向插入位置,p指新插入记录节点*/ char ch, ne

22、w_num[10], old_num[10]; //old_num[]«存插入点囲之前的工号,new_num[]保存输入的新记录 的工号 int flag=0; s=l~>next; 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) //

23、输入'O',跳出 while (1),即跳出 Insert ()函数 return; s=l->next; //作用?每次从第一个节点开始找 flag=O; while (s) /*查询该工号是否存在,flag=l表示该工号存在*/ { if(strcmp(s~>data. num, old_num)==0) { - flag=l; break; } s=s~>next; } if(flag==l) break; /*若工号存在,则进行插入之前的新记录的输入操作*/ else { getchar (); printf (,,\n=====>The numbe

24、r %s is not existing, try again? (y/n):", old_num); scanf &ch); if (ch 二二'y,| | ch 二二'Y') {continue;} else {return;} 〃回主菜单 } }//while(1) /*以下新记录的插入新节点,工号不能跟已存在的工号相同,操作与Add() 相同*/ printf(〃请你输入待插入的工号(以‘0’返回上一级菜单:)〃); scanf (,z%sA new_num); if (strcmp (new_num, "0")=0) //输入'O',跳出 while (1),即跳

25、出 add () 函数 一 return; s=l->next; //作用?每次从第一个节点开始找,看num是否重复。 while(s) //工号重复时,返回主菜单 { if (strcmp (s~>data. 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

26、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); getc

27、har (); printf(〃请你输入工资:〃); scanf&p->data・ gz); getchar (); //信息输入己经完成 p->next二NULL; /*表明这是链表的尾部结点*/ saveflag二1; /*在main()有对该全局变量的判断,若为1,则进行存盘操 作*/ /*将指针赋值给r,因为1中的头节点的下一个节点才实际保存着学生的 记录*/ r二1一>next; while (1) { if (strcmp (r~>data. num, old_num) ==0) /*在链表中插入一个节点*/ { _ p->next=r->next; r

28、一>next二p; break; } r二r一>next; }// whiled) , r作为查询指针,依次从第一个节点找起,找到后跳 出while (1)循环 Disp(l); printf("\n\n"); // getchar (); void Tongji (Link 1) //统计 { Node *max, *min;/*用于指向工资最高的节点*/ Node *t二1->next; if(!t) { system(〃cls"); printf("\n二二二二二〉Not employee record!\n"); getchar (); return;

29、 } system(〃cls〃); Disp(l); max=min=t; while(t) if (t->data. gz>二max-〉data. gz) max=t; if (t->data. gz<=min->data. gz) min=t; t二t~>next; printf ("最高工资为:%d\n", max); printf("\t%s\t%s\t%s\t%s\t%s\t%d\n\n", t-〉data. num, t->data. name, t~>dat a. sex, t~>data. bm, t->data. zc, t->data. gz); print

30、f C最低工资为:%d\n", min); printf("\t%s\t%s\t%s\t%s\t%s\t%d\n\n", t-〉data. num, t->data. name, t~>dat a. sex, t~>data. bm, t->data. zc, t->data. gz); } } void Sort (Link 1) //排序 { Link 11: Node *p, *i\r, *s; int i=0; 辻(l->next==NULL) { system(,zcls/z); printf("\n二二二二二〉Not employee record!\n");

31、 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))

32、 ; /*新建节点用于保存从原链表中 取出的节点信息*/ if(!s) /*s二二NULL*/ printf(z/\n allocate memory failure “); /*如没有申请到, 打印提示信息*/ return ; /*返回主界面*/ } s->data=p->data; /*填数据域*/ s->next=NULL; /* 指针域为空 */ rr=ll; /紅r链表于存储插入单个节点后保持排序的链表,11是这个链表的 头指针,每次从头开始查找插入位置*/ while(rr~>next!二NULL && rr~>next->data. gz>=p->data. g

33、z) {rr=rr->next;} /*指针移至总分比p所指的节点的总分小的节点位 置*/ if(rr->next==NULL)/*若新链表11中的所有节点的总分值都比 p->data.gz大时,就将p所指节点加入链表尾部*/ rr~>next=s; else /*否则将该节点插入至第一个总分字段比它小的节点的前面*/ { s->next二rr->next; rr~>next=s; } p=p->next; /*原链表中的指针下移一个节点*/ } l->next=ll->next; All中存储是的已排序的链表的头指针*/ Disp(l); saveflag=l; pri

34、ntf ("\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

35、) //将第一个记录结点值写 入文件 { p=p->next; //依次写入第二个结点的 值, count++; //文件的记录数+1 } else { flag=0; break; } } //while(p) 辻(count>0) { Printf(/Z\n=====>提示:文件保存成功.(有%d条记录己经保 存.)\n", count); saveflag=0; } else { system("cls"); printf(/z保存文件失败,’O'条记录被保存! \n〃); } fclose(fp); } // void Save 结束 vo

36、id main () { Link list: /*定义链表*/ // struct node *list; FILE *fp; /*文件指针*/ int choose; /*保存选择结果变量*/ char ch; /*保存(y, Y, n, N)*/ int count=0; /*保存文件中的记录条数(或结点个数)*/ struct node *p, *r; /*定义记录指针变量*/ printf (,z\t\t\t\t 职工信息管理系统\n\t\t\t\t\n"); list=(struet node*)malloc(sizeof(struet node)): if (!l

37、ist) { printf(z,\n allocate memory failure “); /*如没有申请到,打印 提不信息*/ return ; /*返回主界面*/ } list->next=NULL; r=list; fp二fopen("employee, txt", "rb"); if(fp==NULL) { printf(/z\n=====>提示:文件还不存在,是否创建?(y/n)\n〃); scanf &ch); if (ch==,y,| | ch==,Y,) fp二fopen("employee . txt","ab+"); else exit (0)

38、; } // if(fp二二NULL) printf (,z\n=====>提示:文件己经打开,正在导入记录 \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->ne

39、xt二NULL; r~>next二p; r二p; /*将该结点挂入链表中,r指向最后的节点*/ count++; } } //while(!feof(fp)) fclose (fp) : /* 关闭文件 */ printf ("\n=二二二〉提示:记录导入完毕,共导入%d条记录・\n,z, count); while (1) { menu (); printf (/z\t\t====>请选择:”); scanf (,z%d,z, &choose); if (choose二二0) { if (saveflag==l) { get char (); printf (/

40、z\n=====>提示:资料己经改动,是否将改动保存到文 件中(y/n)?\nO ; scanf &ch); if (ch 二二'y,| | ch 二二'Y') Save (list); } //辻 printf (z/\n=====>提示:你己经退出系统,再见!\n〃); break; }//if switch(choose) { case 1:Add(list); break; /*增加职工记录*/ case 2: Del(list); break;/*删除职工记录*/ case 3: Qur(list); break;/*查询职工记录*/ case 4:

41、 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() /* */

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

相关资源

更多
正为您匹配相似的精品文档
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!