数据结构课程设计报告_职工信息管理系统_单链表实现程序源代码
数据结构课程设计-职工管理系统

目录一、前言—--——--—-——-———-—————-———-——-———-—————---—-——————-—--————————-————————2二、需求分析—-———-—---—-——————————-———--——-—--——-————-—--——————————---—----—3 三、概要设计—-——-——-—————-———-—-—————————--——-----—--—--————--——-—---—-—————4四、详细设计—-———-———————--—-—-————-—-—————-—-—-———————-——-——-—-----————-—-—5五、调试分析————-————————-—————-——-————--—-——-——--——--—--—---—--——---—--—-——6六、用户使用说明—--——————-————-————-—-—-—-—--—————————-—————-—-———————-——-7 七、测试结果——————-—--—---——--——————--—-———----———--——-—-—-————————---—-———-8八、总结—-———---—-—--———-———-—--—---——--—————--—-—--—————--————————---—----—-11九、主要参考文献和附录—--——-——-—-————--——-——-—--———---—————-——-———————12前言员工管理系统是一个工作单位不可缺少的管理工具,它管理的数据对于公司的决策者和管理者来说都至关重要,所以员工管理系统应该能够为用户提供充足的信息和快捷的查询手段.但一直以来各个公司基本上都是靠传统的人工方式来管理员工信息,这种管理方式存在着许多缺点,如:效率低、保密性差,另外时间一长,将产生大量的文件和数据,这对于信息的查找、更新和维护都带来了不少的困难。
C语言程序设计-职工信息管理系统(链表)

信息与电子工程学院C语言课程设计职工信息管理系统设计实验日期和时间: 2011年06月27日-06月29日实验类别:课程设计实验类型:设计性一、实验环境操作系统:windows xp编程工具:Microsoft Visual C++ 6.0开发环境:CPU(Inter(R)Core(TM)2 Quad cpu QB200 @ 2.33GHz)内存:2.76GB 硬盘:228.3GB开发地点:现代教育中心201机房A17座IP:10.250.11.17二、实验目的和要求实验目的:(1)使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作算法。
(2)使学生进一步掌握程序设计、编写、调试能力。
(3)使学生了解软件开发的基本步骤和内容。
实验要求:完成一个职工信息管理系统程序,具体内容如下:(1)在内存中用链表记录,在硬盘上用二进制文件保存。
(2)设计完的程序能够以命令行或者菜单形式增加、删除、更新和查询数据的内容。
数据内容能够排序以方便查询。
(3)数据库中应该有至少20条记录。
三、实验内容和结果(1)程序整体功能;1、系统总体框2、模块设计该程序主要分为7个模块,分别是创建与添加模块、显示模块、查找模块、修改模块、删除模块、存档模块、文件统计模块、退出模块(2)程序组成及各模块/函数功能;创建与添加模块:该模块的功能是输入职工信息。
函数为void Add(Node *woker)原理:采用尾插法,先建立链表与头结点,新增一个结点,键盘输入职工号、职工姓名、职工性别、职工出生年月、职工学历、职工职位、职工工资,将这些信息存储到新增结点中,将新增加的节点连到链表的尾端,如此以往,将尾结点的指针域置空,这样就得到了一条存储职工信息的链表,这样就完成了职工信息的创建与增加。
显示模块:该模块功能是显示职工信息。
函数为void Disp(Node *woker) 原理:先新建一个指针P指向头结点,判断它的指针域是否为空,若为空,则输出“没有记录可以显示”;若不为空,则输出它的指针域所指向节点所储存的职工信息,并将该指针向后移一个结点,直到P指向空,即输出了所有职工的信息,这样就完成了所有职工信息的显示。
数据结构-单链表基本操作实现(含全部代码)

数据结构-单链表基本操作实现(含全部代码)今天是单链表的实现,主要实现函数如下:InitList(LinkList &L) 参数:单链表L 功能:初始化时间复杂度 O(1)ListLength(LinkList L) 参数:单链表L 功能:获得单链表长度时间复杂度O(n)ListInsert(LinkList &L,int i,ElemType e) 参数:单链表L,位置i,元素e 功能:位置i后插时间复杂度O(n)[加⼊了查找]若已知指针p指向的后插 O(1)ListDelete(LinkList &L,int i) 参数:单链表L,位置i 功能:删除位置i元素时间复杂度O(n)[加⼊了查找]若已知p指针指向的删除最好是O(1),因为可以与后继结点交换数据域,然后删除后继结点。
最坏是O(n),即从头查找p之前的结点,然后删除p所指结点LocateElem(LinkList L,ElemType e) 参数:单链表L,元素e 功能:查找第⼀个等于e的元素,返回指针时间复杂度O(n)代码:/*Project: single linkeed list (数据结构单链表)Date: 2018/09/14Author: Frank YuInitList(LinkList &L) 参数:单链表L 功能:初始化时间复杂度 O(1)ListLength(LinkList L) 参数:单链表L 功能:获得单链表长度时间复杂度O(n)ListInsert(LinkList &L,int i,ElemType e) 参数:单链表L,位置i,元素e 功能:位置i后插时间复杂度O(n)[加⼊了查找]若已知指针p指向的后插 O(1)ListDelete(LinkList &L,int i) 参数:单链表L,位置i 功能:删除位置i元素时间复杂度O(n)[加⼊了查找]若已知p指针指向的删除最好是O(1),因为可以与后继结点交换数据域,然后删除后继结点。
C语言课程设计报告:职工信息管理系统程序设计

1.课程论文题目职工信息管理系统程序设计一、题目要求职工信息包括职工号、姓名、性别、年龄、学历、工资、住址、电话等(职工号不重复)。
试设计一职工信息管理系统,使之能提供以下功能:(1)系统以菜单的方式工作。
(2)职工信息录入功能(职工信息用文件保存)。
(3)职工浏览功能。
(4)职工信息查询功能,查询方式可按学历查询或者工号查询。
(5)职工信息的删除、修改功能(可选项)。
2.程序设计思路1、设计思路(1)根据题目要求,应该把职工工资信息用结构体形式输入,在定义一个全局变量和文件指针进行整个程序的运行,然后把职工工资信息送到文件中,所以应该提供一个结构体和文件的输入输出等操作;(2)在程序中需实现职工工资浏览、查询、统计等功能的操作,所以需要建立相应的功能模块来实现;(3)另外还需要提供键盘式选择菜单实现功能,在运行时达到所要的目的。
3.功能模块图5.算法设计1.主函数提供输入、处理和输出部分的函数调用,各功能模块采用菜单方式选择。
2浏览模块【分析】该模块的功能是浏览职工的全部信息3排序模块4查询模块【分析】该模块的功能是根据输入的职工按照工号和学历查找对应的记录,找到以后,可进行继续查找或修改信息的操作。
流程图如下:5修改模块【分析】该模块的功能是显示所有职工的信息,考虑到记录较多,建议采用分屏显示。
显示完所有记录后,输入要修改的职工的工号,根据工号查到职工的记录,并提示用户修改该记录的哪部分信息,根据用户做的选择修改相应信息。
流程图如下:6.程序代码#include<stdio.h>#define N 50struct worker{char id[50];char name[20];char sex[10];char age[10];char edu[20];char salary[10];char address[20];char tel[20];}worker[N];void save(int n) //保存函数,保存n个记录{ FILE *fp;int i;if((fp=fopen("worker.txt","wb"))==NULL) //以只写方式为输出打开一个二进制文件{ printf("\nCannot open file\n");}for(i=0;i<n;i++)if(fwrite(&worker[i],sizeof(struct worker),1,fp)!=1)printf("file write error\n");fclose(fp);}int load() //加载函数{ FILE *fp;int i;if((fp=fopen("worker.txt","rb"))==NULL){printf("\nCannot open file\n");return NULL;}for(i=0;!feof(fp);i++)fread(&worker[i],sizeof(struct worker),1,fp);fclose(fp);return(i-1);}void no_input(int i,int n) //工号输入函数,i表示第i个职工的信息,n 表示比较到第n个职工{ int j,k,w1;do{w1=0;printf("工号:");scanf("%s",worker[i].id);for(j=0;worker[i].id[j]!='\0';j++)if(worker[i].id[j]<'0'||worker[i].id[j]>'9') //判断工号是否为数字{puts("请重新输入!\n");w1=1;break;}if(w1!=1)for(k=0;k<n;k++) //比较到第N个职工if(k!=i&&strcmp(worker[k].id,worker[i].id)==0) //判断职工号是否有雷同{puts("请重新输入!\n");w1=1;break;}}while(w1==1);}void input(int i) //输入一个记录的函数{ no_input(i,i);printf("姓名:");scanf("%s",worker[i].name);printf("性别:");scanf(" %s",&worker[i].sex);printf("年龄:");scanf("%s",&worker[i].age);printf("工资:");scanf("%s",worker[i].salary);printf("学历:");scanf("%s",&worker[i].edu);printf("住址:");scanf("%s",worker[i].address);printf("电话:");scanf("%s",worker[i].tel);}void printf_one(int i) //显示一个记录的函数{printf("%10s %10s %5s %5s %8s %6s %10s %10s\n",worker[i].id,worker[i].name,worker[i].sex,worker[i].age,worker[i].salary,worker[i].edu,worker[i].address,worker[i].tel); }void printf_back() //一个任务结束后选择是好似浏览还是返回{ int k,w;printf("\n\n\tSuccessful^-^.\n\n");printf("接下来做什么?\n\n\t1).浏览全部\t2).返回: [ ]\b\b");scanf("%d",&w);if(w==1)browse();else menu();}modify_data(int i,int n) //修改函数{ int c,w1;do{puts("\nmodify by=>\n\n 1).工号 2).姓名 3).性别 4).年龄 5).工资6).学历 7).地址 8).电话 9).取消");printf("请选择?:[ ]\b\b");scanf("%d",&c);if(c>9||c<1){puts("\nChoice error!please again!");getchar();}}while(c>9||c<1);do{switch(c){case 1:no_input(i,n);break;case 2:printf("name:");scanf("%s",worker[i].name);break;case 3:printf("sex:");scanf("%s",worker[i].sex);break;case 4:printf("age:");scanf("%s",worker[i].age);break;case 5:printf("salary:");scanf("%s",worker[i].salary);break;case 6:printf("edu:");scanf("%s",worker[i].edu);break;case 7:printf("address:");scanf("%s",worker[i].address);break;case 8:printf("tel:");scanf("%s",worker[i].tel);break;case 9:menu();break;}puts("\nNow:\n");printf_face();printf_one(i);printf("\n确定?\n\n\t1).是2).否,重新修改3).不保存退出[ ]\b\b");scanf("%d",&w1);if(w1==1)save(n);}while(w1==2);return(w1);}printf_face() //显示数据结构项目{ printf("\n\t工号姓名性别年龄工资学历地址电话号码\n"); }void enter() //输入模块{ int i,n;printf("输入多少个职工信息(0-%d):",N-1);scanf("%d",&n);printf("\n 请输入职工信息\n\n");for(i=0;i<n;i++)input(i);if(i!=0)save(n);printf_back();}browse() //浏览模块{ int i,j,n;n=load();printf_face();for(i=0;i<n;i++){if((i!=0)&&(i%10==0)){printf("\n\n按任意键显示下一页...");getch();puts("\n\n");}printf_one(i);}printf("\t这里有 %d 条记录.\n",n);printf("\n按任意键返回...");getch();menu();}modify() //修改模块{struct worker s;FILE *fp;int i,n,k,w0=1,w1,w2=0;n=load();do{k=-1;printf_face();for(i=0;i<n;i++){if((i!=0)&&(i%10==0)) //目的是分屏显示{printf("\n\n记住要修改的工号.按任意键显示下一页");getch();puts("\n\n");}printf_one(i); //调用显示一个记录的函数}do{printf("\n\n输入要修改的职工工号! 工号:");scanf("%s",s.id); //输入要修改的IDfor(i=0;i<n;i++) //查找要修改的数据if(strcmp(s.id,worker[i].id)==0){k=i; //找到要修改的记录s=worker[i]; //把worker[i]备份,以便恢复}if(k==-1)printf("\n\n未找到请重输");}while(k==-1); //当k=-1表示没有找到printf_face(); //调用显示数据结构项目的函数printf_one(k); //调用显示一个记录的函数w1=modify_data(k,n); //修改记录并返回保存控制值w1,w1=1表示用户已确认修改if(w1==1){printf("\Successful^_^.\n\n修改另一个?\n\n\t1).是 2).否,保存退出\t[ ]\b\b");scanf("%d",&w0);w2=1; //用来控制保存,使w2=1是标记已有过修改}else{w0=0;if(w2==1)worker[k]=s;}if(w0!=1&&w2==1)save(n);}while(w0==1);menu();}search() //查询模块{ int c,w1;do{puts("\nsearch by=>\n\n1).工号 2}.学历 3).取消并返回"); printf("Which you needed?:[ ]\b\b");scanf("%d",&c);if(c>3||c<1){ puts("\nchoice error!please again!");getchar();}}while(c>3||c<1);{switch(c){case 1:search1();break;case 2:search2();break;case 3:menu();break;}}}search1() //按工号查询模块{int i,n,k,w1=1,w2,w3,w4;struct worker s;n=load();do{do{k=-1;printf("\n\n输入要查询的工号! id:");scanf("%s",s.id);printf_face();for(i=0;i<n;i++)if(strcmp(s.id,worker[i].id)==0){k=i;printf_one(k);break;}if(k==-1){printf("\n\nNo exit!please");printf("\n\n继续查找?\n\t1).是 2).否,返回 [ ]\b\b");scanf("%d",&w1);if(w1==2) menu();}}while(k==-1&&w1==1);w4=0;w3=0;if(k!=-1){printf("\n\n接下来干什么?\n\t1).查找另一个 2).修改 3).返回菜单[ ]\b\b");scanf("%d",&w2);switch(w2){case 1:search1();break;case 2:w3=modify_data(k,n);break;case 3:{menu();break;}}}}while(w2==1);menu();}search2() //按学历查询模块{int i,n,k,w1=1,w2,w3,w4;struct worker s;n=load();do{do{k=-1;printf("\n\n请输入你要查询的学历:\n");scanf("%s",);printf_face();for(i=0;i<n;i++)if(strcmp(,worker[i].edu)==0){k=i;printf_one(k);}if(k==-1){printf("\n\nNo exit!please");printf("\n\n继续查找?\n\t1).是 2).否,返回 [ ]\b\b");scanf("%d",&w1);if(w1==2) menu();}}while(k==-1&&w1==1);w4=0;w3=0;if(k!=-1){printf("\n\n接下来干什么?\n\t1).查找另一个 2).修改 3).返回菜单[ ]\b\b");scanf("%d",&w2);switch(w2){case 1:search2();break;case 2:w3=modify_data(k,n);break;case 3:{menu();break;}}}}while(w2==1);menu();}menu(){int n,w1;do{puts("\t\t*******************菜单*******************\n\n");puts("\t\t\t\t1.录入职工信息");puts("\t\t\t\t2.浏览职工信息");puts("\t\t\t\t3.查询职工信息");puts("\t\t\t\t4.修改职工信息");puts("\t\t\t\t5.退出");puts("\t\t****************************************\n\n");printf("请选择(1~5): [ ]\b\b");scanf("%d",&n);if(n<1||n>5) //对选择的数字作判断{w1=1;getchar();}else w1=0;} while(w1==1);switch(n){case 1:enter();break; //录入 case 2:browse();break; //浏览 case 3:search();break; //查询 case 4:modify();break; //修改 case 5:exit(0); //退出}}main(){menu();}7.程序运行结果下面是各个模块的的界面截图(1)、主菜单(2)、输入模块(3)、浏览模块(3)、查找模块(4)、修改模块8.编程中遇到的困难及解决方法温故而知新,可以为师矣。
数据结构课程设计实验报告 完整版

第一章链表的应用线性表是数据结构中最简单、最常用的一种线性结构,也是学习数据结构全部内容的基础,其掌握的好坏直接影响着后继课程的学习。
线性表的顺序存储结构,即顺序表的概念相对比较简单,因此,本章的主要任务是使用有关单链表的操作来实现通讯录信息系统的管理。
1.1设计要求本章的设计实验要求使用有关链表的操作来实现通讯录信息系统的管理。
为了验证算法,通讯录管理包括单通讯录链表的建立、通讯者的插入、通讯者的删除、通讯者的查询及通讯录表的输出等。
主控菜单的设计要求使用数字0—5来选择菜单项,其他输入则不起作用。
程序运行后,给出6个菜单项的内容和输入提示:1.通讯录链表的建立2. 通讯者结点的插入3. 通讯者结点的查询4. 通讯者结点的删除5. 通讯录链表的输出0. 退出管理系统请选择0—5:1.2设计分析1.2.1主控菜单函数设计分析1.实现循环和功能选择首先编写一个主控菜单驱动程序,输入0—5以进入相应选择项。
假设输入选择用变量sn存储,它作为menu_select函数的返回值给switch语句。
使用for循环实现重复选择,并在主函数main()中实现。
实际使用时,只有选择大于5或小于0的值,程序才能结束运行,这就要使用循环控制。
这里使用for循环语句实现菜单的循环选择,为了结束程序的运行,使用了“return”语句,也可以使用“exit(0);”语句。
2.得到sn的合理值如前所述,应该设计一个函数用来输出提示信息和处理输入,这个函数应该返回一个数值sn,以便供给switch语句使用。
假设函数名为menu_select,对于sn的输入值,在switch 中case语句对应数字1—5,对于不符合要求的输入,提示输入错误并要求重新输入。
将该函数与主函数合在一起,编译运行程序,即可检查并验证菜单选择是否正确。
1.2.2功能函数设计分析1.建立通讯录链表的设计这里实际上是要求建立一个带头结点的单链表。
建立单链表有两种方法,一种称之为头插法,另一种称为尾插法。
数据结构课程设计 简单的职工管理系统

数据结构课程设计题目名称:简单的职工管理系统计算机科学与技术学院一.需求分析1.问题描述对单位的职工进行管理,包括插入、删除、查找、排序等功能。
2.要求职工对象包括姓名、性别、出生年月、工作年月、学历、职务、住址、电话等信息。
(1)新增一名职工:将新增职工对象按姓名以字典方式职工管理文件中。
(2)删除一名职工:从职工管理文件中删除一名职工对象。
(3)查询:从职工管理文件中查询符合某些条件的职工。
(4)修改:检索某个职工对象,对其某些属性进行修改。
(5)排序:按某种需要对职工对象文件进行排序。
3.实现提示职工对象数不必很多,便于一次读入内存,所有操作不经过内外存交换。
(1)由键盘输入职工对象,以文件方式保存。
程序执行时先将文件读入内存。
(2)对职工对象中的"姓名"按字典顺序进行排序。
(3)对排序后的职工对象进行增、删、查询、修改等操作。
二.概要设计1.设计一个职工的结构体typedef struct Worker{char* name;char* sex;char* Bothdate;char* Workdate;char* school;char* duty;char* address;char* phone;struct Worker *next;}worker;2.主体函数(1).输入函数void Scanfwork(worker** phead,worker** pend,int num);(2).输出函数void Printfwork(worker* phead);(3).查询职工函数void Findworker(worker* phead);(4).更新职工函数void Updata(worker* phead);(5).删除职工函数void Delwork(worker** phead,worker** pend);void Delete(worker** phead,worker** pend,char* name);(6).按字典排序函数worker* Sort(worker** phead,worker** pend,int num);(7).文件调用函数void save(worker* phead);(8).增加职工函数void Addworker(worker** phead,worker** pend,worker* p);worker* GetnodeIn();三.详细设计1.流程图2.代码详细分析(1).输入函数void Scanfwork(worker** phead,worker** pend,int num){int i;srand((unsigned int)time(0));for(i=0;i<num;i++){Addworker(phead,pend,Getwork());}}(2).输出函数void Printfwork(worker* phead){while(phead){printf("%s %s %s %s %s %s %s %s\n",phead->name,phead->se x,phead->Bothdate,phead->Workdate,phead->school,phead->duty,phead->phone, phead->address);phead=phead->next;}printf("b返回主菜单");key=getchar();switch (key){case 'b':return;break;default:printf("按错了\n");}}(3).查询职工函数void Findworker(worker* phead){char* keyword = NULL;worker* w=NULL;worker* newhead=NULL;worker* newend=NULL;worker* pDel=NULL;worker* bj=phead;while(1){while(1){printf("请输入要查询的关键字:");keyword=getstring();printf("按a键确认你的输入,按其他键重新输入:");if(getkey()=='a'){break;}else{free(keyword);keyword=NULL;}}phead=bj;while(phead){if(strncmp(phead->name,keyword,strlen(keyword))==0||strncmp(phead->sex,keyword,strlen(keyword))==0||strncmp(phead->Bothdate,keyword,strlen(keyword))==0||strncmp(phead->Workdate,keyword,strlen(keyword))==0||strncmp(phead->school,keyword,strlen(keyword))==0||strncmp(phead->duty,keyword,strlen(keyword))==0||strncmp(phead->address,keyword,strlen(keyword))==0||strncmp(phead->phone,keyword,strlen(keyword))==0) {w=(worker*)malloc(sizeof(worker));w->name=phead->name;w->sex=phead->sex;w->Bothdate=phead->Bothdate;w->Workdate=phead->Workdate;w->duty=phead->duty;w->school=phead->school;w->address=phead->address;w->phone=phead->phone;w->next=NULL;Addworker(&newhead,&newend,w);}phead=phead->next;}if(newhead!=NULL){Printfwork(newhead);while(newhead){pDel=newhead;newhead=newhead->next;free(pDel);pDel=NULL;}newhead=NULL;newend=NULL;}if(key=='b'){return;}else{printf("没有找到\n");}}}(4).更新职工函数void Updata(worker* phead){worker* bj=phead;char* name1;while(1){printf("请输入要修改的名字");name1=getstring();phead=bj;while(phead){if(strncmp(phead->name,name1,strlen(name1))==0){printf("请输入新的电话号码");free(phead->phone);phead->phone=getstring();}phead=phead->next;}printf("y继续修改,其他键返回");if(getkey()!='y'){return;}}(5).删除职工函数void Delwork(worker** phead,worker** pend){char* name1;while(1){printf("请输入删除的姓名:");name1=getstring();Delete(phead,pend,name1);printf("按y继续删除其他键返回主菜单\n");if(getkey()!='y'){return;}}}void Delete(worker** phead,worker** pend,char* name){worker* bj= *phead;worker* pDel=NULL;if(strncmp((*phead)->name,name1,strlen(name1))==0){pDel=*phead;*phead=(*phead)->next;free(pDel);pDel=NULL;return;}while(bj->next!=NULL){if(strncmp(bj->next->name,name1,strlen(name1))==0){pDel=bj->next;bj->next=bj->next->next;free(pDel);pDel=NULL;if(bj->next==NULL){*pend=bj;}return;}bj=bj->next;}}(6).按字典排序函数worker* Sort(worker** phead,worker** pend,int num)int i;int j;worker* bj=*phead;worker* sign=NULL;worker* sign1=NULL;char temp[20]={0};char temp1[20]={0};char temp2[20]={0};char temp3[20]={0};char temp4[20]={0};char temp5[20]={0};char temp6[15]={0};char temp7[12]={0};for(i=0;i<num;i++){bj=(*phead);sign=bj;for(j=i+1;j<num;j++){sign1=sign->next;if(strncmp(sign->name,sign1->name,strlen(sign1->name))>=0){strcpy(temp,sign->name);strcpy(temp1,sign->sex);strcpy(temp2,sign->Bothdate);strcpy(temp3,sign->Workdate);strcpy(temp4,sign->school);strcpy(temp5,sign->duty);strcpy(temp6,sign->address);strcpy(temp7,sign->phone);strcpy(sign->name,sign1->name);strcpy(sign->sex,sign1->sex);strcpy(sign->Bothdate,sign1->Bothdate);strcpy(sign->Workdate,sign1->Workdate);strcpy(sign->school,sign1->school);strcpy(sign->duty,sign1->duty);strcpy(sign->address,sign1->address);strcpy(sign->phone,sign1->phone);strcpy(sign1->name,temp);strcpy(sign1->sex,temp1);strcpy(sign1->Bothdate,temp2);strcpy(sign1->Workdate,temp3);strcpy(sign1->school,temp4);strcpy(sign1->duty,temp5);strcpy(sign1->address,temp6);strcpy(sign1->phone,temp7);}sign=sign->next;}}return *phead;}(7).文件调用函数void save(worker* phead){FILE* pf;fopen_s(&pf,"F:\\worker.txt","w+");while(phead){fprintf(pf,"%s %s %s %s %s %s %s %s\n",phead->name,phead->sex,phead->Bothdate,phead->Workdate,phead->school,phead->duty,phead->phone,phead->address);phead=phead->next;}fclose(pf);}(9).增加职工函数void Addworker(worker** phead,worker** pend,worker* p){if(*phead==NULL){*phead=p;}else{(*pend)->next=p;}*pend=p;}worker* GetnodeIn(){worker* w=(worker*)malloc(sizeof(worker));printf("请输入名字\n");w->name=getstring();printf("请输入性别\n");w->sex=getstring();printf("请输入出生年月\n");w->Bothdate=getstring();printf("请输入工作年月\n");w->Workdate=getstring();printf("请输入学历\n");w->school=getstring();printf("请输入职务\n");w->duty=getstring();printf("请输入电话\n");w->phone=getstring();printf("请输入住址\n");w->address=getstring();w->next=NULL;return w;}四.调试分析1.在写职工程序的时候遇到了单链表排序问题,解决的方法我选择了询问网络以及身边的朋友2.当写删除的时候遇到了头删除的问题,解决方法我选择了查看书籍3.当调用文件保存的时候也遇到了问题,例如文件内容不能直接覆盖,数据不能全部输出等问题,解决的方法我选择了询问网络,查看视频等4.在写职工程序的时候,虽然遇到了很多问题,我通过自己的努力以及身边朋友的帮助,使我克服了问题,这次的课程设计提高我自己写代码能力,以及训练了我运用链表的增删改查方面的知识和文件的调用存取方面的知识。
数据结构课程设计报告(员工管理系统)

数据结构课程设计报告一、课程设计目的:综合运用线性表、查找、排序的相关知识,解决一个实际应用问题。
通过本次实习,要求熟练掌握线性表的存储结构,能在对应的存储结构上进行各种操作,并能分析不同的查找和排序方法的性能。
二、设计基本信息:每个员工的信息包括:编号、姓名、性别、出生年月、学历、职务、电话、住址等三、课程设计需要实现的功能:(1)查询:按特定条件查找员工。
(2)更新:按编号对某个员工的某项信息进行修改。
(3)插入:加入新员工的信息。
(4)删除:按编号删除已离职的员工的信息。
(5)排序:按工资,对所有员工的信息进行排序。
四、功能实现代码:#include <string>#include <iostream>#include <fstream>#include <iomanip>#include <memory.h>#include <stdio.h>#include <conio.h>#include <stdlib.h>using namespace std;struct Employee{//声明职工的结构作为链表节点。
//-----数据域-----string m_Code;string m_Name;unsigned short int m_Year;string m_Gender;string m_Edu;string m_Post;unsigned int m_Tel;string m_Add;unsigned int m_Wage;//链表节点的指针域---struct Employee* Next;};typedef struct Employee Node;typedef Node* Link;//-------函数声明-------------Link Create(Link Head);void Release(Link Head);Link Add(Link Head);bool Search(Link Head);Link Search_Unique(Link Head);void Display_List(Link Head);void Display_Node(Link pNode);Link Modify(Link Head);Link Del(Link Head);void Save_ByFile(Link Head,fstream& ofile); Link Sort(Link Head);//-------函数实现--------------------------Link Create(Link Head){//创建一个带头节点的空链表。
数据结构C语言版 单链表源代码

/*单链表的各种操作*/#include <stdio.h>#include <malloc.h>#define null 0typedef int ElemType; /* 字符型数据*/struct LNode{ElemType data;struct LNode*next;};ﻩvoidsetnull(struct LNode **p);int length (struct LNode **p);ElemType get(struct LNode **p,int i);voidinsert(struct LNode **p,ElemType x,int i);void dele(struct LNode **p,int i);void display(structLNode **p);int locate(struct LNode **p,ElemTypex);void main(){ﻩstruct LNode *head,*q; /*定义静态变量*/ int select,x1,x2,x3,x4;ﻩint i,n;int m,g;char e,y;setnull(&head);/*建设链表并设置为空表*/printf("请输入数据长度:");scanf("%d",&n);ﻩfor(i=1;i<=n;i++){printf("将数据插入到单链表中:");ﻩﻩscanf("%d",&y);insert(&head,y,i);}/*插入数据到链表*/ﻩdisplay(&head); /*显示链表所有数据*/ﻩprintf("select 1 求长度length()\n");ﻩﻩprintf("select 2取结点get()\n");ﻩﻩprintf("select 3 求值查找locate()\n");ﻩprintf("select 4 删除结点delete()\n");ﻩﻩprintf("select 0 退出\n");ﻩﻩprintf("input your select: ");scanf("%d",&select);while(select!=0){switch(select)ﻩ{ﻩﻩcase 1:ﻩ{ﻩﻩﻩx1=length(&head);ﻩﻩprintf("输出单链表的长度%d",x1);ﻩﻩdisplay(&head);ﻩ}break;case 2:ﻩﻩ{ﻩprintf("请输入要取得结点: ");ﻩﻩscanf("%d",&m);ﻩx2=get(&head,m);printf("%d",x2);ﻩﻩdisplay(&head);}break;ﻩﻩcase3:ﻩﻩﻩ{ﻩprintf("请输入要查找的数据: ");ﻩscanf("%d",&e);ﻩx3=locate(&head,e);ﻩﻩprintf("%d",x3);ﻩdisplay(&head);ﻩ}break;ﻩﻩﻩcase 4:ﻩﻩ{ﻩﻩprintf("请输入要删除的结点:");ﻩscanf("%d",&g);dele(&head,g);ﻩﻩﻩdisplay(&head);ﻩ}break;ﻩ}printf("select 1求长度length()\n");printf("select2取结点get()\n"); ﻩﻩprintf("select 3求值查找locate()\n");printf("select 4删除结点delete()\n");printf("select 0退出\n");printf("input yourselect: ");ﻩscanf("%d",&select);ﻩ}ﻩ}void setnull(struct LNode **p){ﻩ*p=null;}intlength(struct LNode **p){ﻩint n=0;ﻩstruct LNode*q=*p;ﻩwhile (q!=null){ﻩn++;q=q->next;ﻩ}return(n);}ElemTypeget(struct LNode **p,int i) {intj=1;ﻩstruct LNode *q=*p;while (j<i&&q!=null)ﻩ{ﻩq=q->next;j++;ﻩ}ﻩif(q!=null)ﻩﻩreturn(q->data);elseﻩ{printf("位置参数不正确!\n");ﻩreturn0;}ﻩ}int locate(structLNode **p,ElemType x) {ﻩint n=0;ﻩstruct LNode*q=*p;ﻩwhile (q!=null&&q->data!=x){q=q->next;ﻩﻩn++;ﻩ}if(q==null)ﻩreturn(-1);ﻩelsereturn(n+1);}voidinsert(structLNode**p,ElemType x,int i){intj=1;ﻩstruct LNode *s,*q;s=(structLNode*)malloc(sizeof(structLN ode));ﻩs->data=x;q=*p;ﻩif(i==1)ﻩ{s->next=q;ﻩ*p=s;ﻩ}ﻩelse{ﻩwhile(j<i-1&&q->next!=null){ﻩﻩq=q->next;ﻩﻩj++;ﻩﻩ}ﻩﻩif(j==i-1)ﻩ{ﻩs->next=q->next;ﻩq->next=s;}ﻩelseprintf("位置参数不正确!\n");ﻩ}ﻩ}voiddele(struct LNode **p,int i) {ﻩint j=1;ﻩstruct LNode*q=*p,*t;ﻩif(i==1){ﻩﻩt=q;ﻩﻩ*p=q->next;ﻩ}ﻩelseﻩ{ﻩﻩwhile(j<i-1&&q->next!=null)ﻩﻩ{ﻩﻩﻩq=q->next;ﻩj++;ﻩﻩ}ﻩif(q->next!=null&&j==i-1)ﻩ{ﻩﻩﻩt=q->next;ﻩﻩq->next=t->next;}elseﻩﻩprintf("位置参数不正确!\n");}if(t!=null)ﻩfree(t);}void display(struct LNode **p){structLNode*q;ﻩq=*p;printf("单链表显示: ");ﻩif(q==null)printf("链表为空!");else if(q->next==null)ﻩprintf("%d\n",q->data);else{ﻩwhile(q->next!=null)ﻩ{ﻩﻩﻩprintf("%d->",q->data); ﻩﻩﻩq=q->next;ﻩﻩ}ﻩprintf("%d",q->data);}ﻩprintf("\n");}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//要求用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->data .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) //修改功能结束//插入记录:按工号查询到要插入的节点的位置,然后在该工号之后插入一个新节点。