数据结构课程设计_职工信息管理系统_单链表实现程序源代码_第1页
数据结构课程设计_职工信息管理系统_单链表实现程序源代码_第2页
数据结构课程设计_职工信息管理系统_单链表实现程序源代码_第3页
免费预览已结束,剩余15页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、WORD格式/ 要求用 C 语言完成课程设计 职工信息管理系统单链表实现#include <stdio.h> #include <stdlib.h> #include <string.h>int saveflag=0; /*是否需要存盘的标志变量*/struct employeechar name15;char num10;/*工号 */char sex4;char bm15;char zc20;int gz;typedef struct nodestruct employee data;struct node *next;Node,*Link;/Link

2、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); /本函数用于打印链表中某个节点的数据

3、内容 */ 以下 4 个函数用于输出中文标题 void printstart();void Wrong(); void Nofind(); void printc();专业资料整理WORD格式void menu()printf("t*n");printf("t*n");printf("t*职工信 息管理系 统 _构造 体数 组实现*n");printf("t*n")printf("t*1增加职工信息2删除职工信息*n");printf("t*3查询职工信息4修改职工信息*n"

4、);printf("t*5插入职工记录6统计职工记录*n");printf("t*7排序8保存职工信息*n");printf("t*9显示数据0退出系统*n");printf("t*n");printf("t*n"); /void menu菜单完毕voidDisp(Linkl) /显示单链表 l 中存储的职工记录,内容为employee 构造中定义的内容int count=0;Node *p;p=l->next; / l 存储的是单链表中头结点的指针, 该头结点没有存储职工信息,指针域指向

5、的后继结点才有职工信息if(!p)/*p=NULL,NUll在 stdlib中定义为 0*/printf("n=> 提示 : 没有职工记录可以显示 !n"); return;专业资料整理WORD格式printf("tttt显示结果 n");专业资料整理WORD格式printstart();printc();/打印横线打印各学科标题专业资料整理WORD格式printf("n");专业资料整理WORD格式while(p)/逐条输出链表中存储的职工信息printe(p);p=p->next;专业资料整理WORD格式printst

6、art();printf("n"); /void Disp完毕专业资料整理WORD格式void printstart()printf("-n");专业资料整理WORD格式void Wrong()printf("n=>提示 : 输入错误 !n");void Nofind()printf("n=>提示 : 没有找到该职工 !n");专业资料整理WORD格式void printc() /*本函数用于输出中文*/专业资料整理WORD格式专业资料整理WORD格式printf("工号 t* 性别 部门 职

7、称 工资 总工资平均工资 n");专业资料整理WORD格式专业资料整理WORD格式void printe(Node *p)/*本函数用于打印链表中某个节点的数据内容*/专业资料整理WORD格式专业资料整理WORD格式printf("%-12s%st%st%dt%dt%dt %dt %dn",p->data.num,p->,p->data.sex,p->data.bm,p->data.zc,p->dat a.gz);/Locate(l,findmess,"num");/*该函数用于定位连表中符

8、合要求的结点,并返回该指针*/专业资料整理WORD格式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->

9、next;while(r!=NULL)if(strcmp(r->data.zc,findmess)=0) /*假设找到 findmess 值的职工职称 */return r;r=r->next;return 0; /*假设未找到,返回一个空指针*/add()函数中 , 无节点时 ,r 指向 list头 , 有节点时 ,r指向末尾节点专业资料整理WORD格式void Add(Link l) /*增加职工*/专业资料整理WORD格式Node *p,*r,*s; /*实现添加操作的临时的构造体指针变量*/char num10;int flag=0;r=l;s=l->next; /链

10、表没有节点时, s=null;/链表有节点时,指向第一个职工节点while(r->next!=NULL) /如果存在后继结点时, r 指针后移一个r=r->next; /*将指针移至于链表最末尾,准备添加记录*/专业资料整理WORD格式while(1)专业资料整理WORD格式printf(" 请你输入工号 ( 以'0' 返回上一级菜单 :)"); scanf("%s",num);if(strcmp(num,"0")=0) /输入 '0',跳出 while(1),即跳出add() 函数brea

11、k;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);prin

12、tf("请你输入* :");scanf("%s",p->);getchar();printf("请你输入性别 :");scanf("%s",p->data.sex);getchar();printf("请你输入职工所在部门 :");scanf("%d",&p->data.bm);getchar();printf("请你输入职工职称 :");scanf("%d",&p->data.

13、zc);getchar();printf("请你输入职工工资 :");scanf("%d",&p->data.gz);getchar();/*信息输入已经完成*/p->next=NULL; /*说明这是链表的尾部结点*/专业资料整理WORD格式r->next=p;/*将新建的结点参加链表尾部中*/专业资料整理WORD格式r=p;saveflag=1; /while(1) /void Add 增加完毕专业资料整理WORD格式void Del(Link l) /*删除*/专业资料整理WORD格式专业资料整理WORD格式int sel

14、;Node *p,*r; /* 实现删除操作的临时的构造体指针变量 */ char findmess20;专业资料整理WORD格式if(!l->next) /当list无后继结点时,提示和完毕返回del()专业资料整理WORD格式专业资料整理WORD格式printf("n=>提示 : 没有记录可以删除!n");专业资料整理WORD格式return;专业资料整理WORD格式printf("n=>1按工号删除n=>2 按*删除n");专业资料整理WORD格式scanf("%d",&sel);专业资料整理WO

15、RD格式if(sel=1)/按工号删除专业资料整理WORD格式专业资料整理WORD格式printf("请你输入要删除的工号:");专业资料整理WORD格式scanf("%s",findmess);p=Locate(l,findmess,"num");if(p)r=l;while(r->next!=p)专业资料整理WORD格式r=r->next; /从第一个结点找起,直到发现r->next=p,是待专业资料整理WORD格式删除结点, 跳出循环专业资料整理WORD格式r->next=p->next;/rr-&

16、gt;next(p)p->next专业资料整理WORD格式free(p);专业资料整理WORD格式printf("n=>提示 : 该职工已经成功删除!n");专业资料整理WORD格式saveflag=1;else专业资料整理WORD格式Nofind(); /显示一句话专业资料整理WORD格式 /if(sel=1)专业资料整理WORD格式else if(sel=2)/按*删除专业资料整理WORD格式专业资料整理WORD格式printf("请你输入要删除的* :");scanf("%s",findmess);p=Locate(

17、l,findmess,"name");if(p)r=l;while(r->next!=p)r=r->next;r->next=p->next;/rr->next(p)p->nextfree(p);printf("n=>提示 : 该职工已经成功删除 !n");saveflag=1;elseNofind(); /if(sel=2) elseWrong(); / 显示输入错误的话 /void Del删除完毕void Qur(Link l)/查询功能int sel;char findmess20;Node *p;/实现查

18、询操作的临时的构造体指针变量if(!l->next)printf("n=>提示 : 没有资料可以查询 !n");return;printf("n=>1 按工号查找 n=>2 按职称查找 n"); scanf("%d",&sel);if(sel=1)/*工号 */printf("请你输入要查找的工号 :");scanf("%s",findmess);专业资料整理WORD格式p=Locate(l,findmess,"num");专业资料整理WORD

19、格式if(p)专业资料整理WORD格式printf("ttttprintstart();printc();printe(p);printstart();/查找结果 n");打印横线打印各学科标题打印 p 结点各个数据成员的值打印横线专业资料整理WORD格式elseNofind(); /if(sel=1)专业资料整理WORD格式else if(sel=2) /*职称*/专业资料整理WORD格式专业资料整理WORD格式printf("请你输入要查找的职称 :");scanf("%s",findmess);p=Locate(l,findme

20、ss,"zc");if(p)专业资料整理WORD格式printf("tttt查找结果 n");专业资料整理WORD格式printstart();printc();printe(p);printstart();elseNofind();elseWrong();专业资料整理WORD格式 /void Qur查询完毕专业资料整理WORD格式void Modify(Link l)/修改功能专业资料整理WORD格式Node *p;char findmess20;if(!l->next)专业资料整理WORD格式printf("n=>提示 : 没有

21、资料可以修改!n");专业资料整理WORD格式return;专业资料整理WORD格式printf("请你输入要修改的职工工号:");scanf("%s",findmess);专业资料整理WORD格式p=Locate(l,findmess,"num");if(p)printf(" 请你输入新工号 ( 原来是 %s):",p->data.num); scanf("%s",p->data.num);printf(" 请你输入新* ( 原来是 %s):",p-&

22、gt;); 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):&quo

23、t;,p->data.zc); scanf("%d",&p->data.zc);getchar();printf(" 请你输入新的工资 ( 原来是 %d):",p->data.gz); scanf("%d",&p->data.gz);专业资料整理WORD格式printf("n=>提示 : 资料修改成功!n");专业资料整理WORD格式/shoudsave=1;else专业资料整理WORD格式Nofind(); /if(p) /void Modify(Link l) /完

24、毕修改功能完毕专业资料整理WORD格式/ 插入记录 : 按工号查询到要插入的节点的位置,然后在该工号之后插入一个新节点。void Insert(Link l)Node *s,*r,*p; /*p指向插入位置, p 指新插入记录节点 */char ch,new_num10,old_num10;/old_num保存插入点位置之前的工号,new_num 保存输入的新记录的工号int flag=0;专业资料整理WORD格式s=l->next;system("cls");Disp(l);while(1)/stringinput(s,10,"please input i

25、nsert location after the Number:");printf("请你输入已存在的工号 ( 以'0' 返回上一级菜单 :)");scanf("%s",old_num);if(strcmp(old_num,"0")=0) /输入 '0',跳出while(1),即跳出Insert()函数return;s=l->next; /作用?每次从第一个节点开场找flag=0;while(s) /*查询该工号是否存在, flag=1 表示该工号存在 */if(strcmp(s->

26、;data.num,old_num)=0)flag=1;break;s=s->next;if(flag=1)break; /*假设工号存在,那么进展插入之前的新记录的输入操作*/elsegetchar();printf("n=>The number %s is not existing,try again"(y/n):",old_num);scanf("%c",&ch);if(ch='y'|ch='Y')continue;elsereturn; /回主菜单专业资料整理WORD格式/while(

27、1)专业资料整理WORD格式/* 以下新记录的插入新节点, 工号不能跟已存在的工号一样, 操作与 Add() 一样 */专业资料整理WORD格式printf("请你输入待插入的工号( 以'0'返回上一级菜单:)");专业资料整理WORD格式scanf("%s",new_num);专业资料整理WORD格式if(strcmp(new_num,"0")=0) /输入 '0',跳出while(1),即跳出add()专业资料整理WORD格式函数return;s=l->next; /作用?每次从第一个节点开场

28、找,看num是否重复。while(s) /工号重复时,返回主菜单if(strcmp(s->data.num,new_num)=0)printf("=> 提 示 : 工 号 为 '%s' 的 职 工 已 经 存 在 '!n",new_num);flag=1;return ;s=s->next; /while(s)p=(Node *)malloc(sizeof(Node);if(!p)专业资料整理WORD格式提示信息printf("n allocate memory failure "); /*/return ;/*

29、返回主界面*/如没有申请到,打印专业资料整理WORD格式专业资料整理WORD格式strcpy(p->data.num,new_num);printf("请你输入* :");scanf("%s",p->);getchar();printf("请你输入性别 :");scanf("%s",p->data.sex);getchar();printf("请你输入部门 :");scanf("%d",&p->data.bm);getchar

30、();printf("请你输入职称 :");scanf("%d",&p->data.zc);getchar();专业资料整理WORD格式printf("请你输入工资 :");scanf("%d",&p->data.gz);getchar();/ 信息输入已经完成p->next=NULL; /*说明这是链表的尾部结点*/saveflag=1;/* 在 main() 有对该全局变量的判断,假设为1, 那么进展存盘操作 */* 将指针赋值给 r, 因为 l 中的头节点的下一个节点才实际保

31、存着学生的记录 */r=l->next;while(1)专业资料整理WORD格式if(strcmp(r->data.num,old_num)=0) /*在链表中插入一个节点*/专业资料整理WORD格式p->next=r->next;r->next=p;break;专业资料整理WORD格式专业资料整理WORD格式r=r->next;/ while(1)出 while(1)循环,r作为查询指针,依次从第一个节点找起,找到后跳专业资料整理WORD格式Disp(l);printf("nn");/ getchar();专业资料整理WORD格式voi

32、d Tongji(Link l)/统计专业资料整理WORD格式专业资料整理WORD格式Node *max,*min;/*用于指向工资最高的节点*/专业资料整理WORD格式Node *t=l->next;if(!t)专业资料整理WORD格式system("cls");printf("n=>Not employee record!n");getchar();return;system("cls");专业资料整理WORD格式Disp(l);max=min=t;while(t)if(t->data.gz>=max-&g

33、t;data.gz)max=t;if(t->data.gz<=min->data.gz)min=t;t=t->next;printf("最高工资为: %dn",max);printf("t%st%st%st%st%st%dnn",t->data.num,t->,t->dat a.sex,t->data.bm,t->data.zc,t->data.gz);printf("最低工资为: %dn",min);printf("t%st%st%st%st%s

34、t%dnn",t->data.num,t->,t->dat a.sex,t->data.bm,t->data.zc,t->data.gz);专业资料整理WORD格式void Sort(Link l)/排序专业资料整理WORD格式专业资料整理WORD格式Link ll;Node *p,*rr,*s;int i=0;if(l->next=NULL) system("cls");printf("n=>Not employee record!n");getchar();return ;l

35、l=(Node*)malloc(sizeof(Node); /*用于创立新的节点 */if(!ll)专业资料整理WORD格式提示信息printf("n allocate memory failure "); /*/return ;/*返回主界面*/如没有申请到,打印专业资料整理WORD格式ll->next=NULL;system("cls");专业资料整理WORD格式Disp(l); /*显示排序前的所有职工记录*/专业资料整理WORD格式p=l->next;专业资料整理WORD格式while(p) /*p!=NULL*/s=(Node*)m

36、alloc(sizeof(Node); /*新建节点用于保存从原链表中取出的节点信息 */专业资料整理WORD格式if(!s) /*s=NULL*/专业资料整理WORD格式打印提示信息printf("n allocate memory failure "); /*/return ;/*返回主界面*/如没有申请到,专业资料整理WORD格式专业资料整理WORD格式s->data=p->data; /*s->next=NULL;/*填数据域 */指针域为空*/专业资料整理WORD格式rr=ll;专业资料整理WORD格式/*rr链表于存储插入单个节点后保持排序的链

37、表,ll是这个链表的专业资料整理WORD格式头指针 , 每次从头开场查找插入位置*/专业资料整理WORD格式while(rr->next!=NULL && rr->next->data.gz>=p->data.gz)rr=rr->next; /*指针移至总分比p 所指的节点的总分小的节点位置 */if(rr->next=NULL)/* 假设新链表 ll 中的所有节点的总分值都比 p->data.gz 大时,就将 p 所指节点参加链表尾部 */rr->next=s;else /*否那么将该节点插入至第一个总分字段比它小的节点的

38、前面*/s->next=rr->next;rr->next=s;p=p->next; /*原链表中的指针下移一个节点*/l->next=ll->next; /*ll中存储是的已排序的链表的头指针*/Disp(l);saveflag=1;printf("n=>sort complete!n");void Save(Link l)FILE* fp;Node *p; / 实现保存操作的临时的构造体指针变量 int flag=1,count=0;fp=fopen("employee.txt","wb"

39、);if(fp=NULL)printf("n=> 提示 : 重新翻开文件时发生错误 !n"); return;专业资料整理WORD格式专业资料整理WORD格式p=l->next; /pwhile(p)指向第一个记录结点专业资料整理WORD格式if(fwrite(p,sizeof(Node),1,fp)=1) /将第一个记录结点值写专业资料整理WORD格式入文件专业资料整理WORD格式p=p->next;/依次写入第二个结点的专业资料整理WORD格式值,专业资料整理WORD格式count+;/文件的记录数+1专业资料整理WORD格式专业资料整理WORD格式e

40、lseflag=0;break; /while(p)if(count>0)printf("n=>提 示 : 文 件 保 存 成 功 .( 有 %d 条 记 录已 经保存 .)n",count);saveflag=0;elsesystem("cls");专业资料整理WORD格式printf("保存文件失败,'0'条记录被保存!n");专业资料整理WORD格式fclose(fp); / void Save完毕专业资料整理WORD格式void main()专业资料整理WORD格式Link list; /*FILE

41、 *fp; /*int choose; /*char ch;/*定义链表 */ / struct node *list;文件指针 */保存选择结果变量 */保存 (y,Y,n,N)*/专业资料整理WORD格式int count=0; /*struct node *p,*r;printf("tttt保存文件中的记录条数或结点个数/*定义记录指针变量 */职工信息管理系统 nttttn");*/专业资料整理WORD格式list=(struct node*)malloc(sizeof(struct node);if(!list)专业资料整理WORD格式提示信息printf(&qu

42、ot;n allocate memory failure "); /*/return ;/*返回主界面*/如没有申请到,打印专业资料整理WORD格式专业资料整理WORD格式list->next=NULL;r=list;fp=fopen("employee.txt","rb");if(fp=NULL)专业资料整理WORD格式printf("n=>提示 : 文件还不存在,是否创立?(y/n)n");专业资料整理WORD格式scanf("%c",&ch);if(ch='y'|ch='Y')fp=fopen("employee

温馨提示

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

评论

0/150

提交评论