数据结构课程设计_职工信息管理系统_单链表实现程序源代码
数据结构课程设计-职工管理系统
目录一、前言—--——--—-——-———-—————-———-——-———-—————---—-——————-—--————————-————————2二、需求分析—-———-—---—-——————————-———--——-—--——-————-—--——————————---—----—3 三、概要设计—-——-——-—————-———-—-—————————--——-----—--—--————--——-—---—-—————4四、详细设计—-———-———————--—-—-————-—-—————-—-—-———————-——-——-—-----————-—-—5五、调试分析————-————————-—————-——-————--—-——-——--——--—--—---—--——---—--—-——6六、用户使用说明—--——————-————-————-—-—-—-—--—————————-—————-—-———————-——-7 七、测试结果——————-—--—---——--——————--—-———----———--——-—-—-————————---—-———-8八、总结—-———---—-—--———-———-—--—---——--—————--—-—--—————--————————---—----—-11九、主要参考文献和附录—--——-——-—-————--——-——-—--———---—————-——-———————12前言员工管理系统是一个工作单位不可缺少的管理工具,它管理的数据对于公司的决策者和管理者来说都至关重要,所以员工管理系统应该能够为用户提供充足的信息和快捷的查询手段.但一直以来各个公司基本上都是靠传统的人工方式来管理员工信息,这种管理方式存在着许多缺点,如:效率低、保密性差,另外时间一长,将产生大量的文件和数据,这对于信息的查找、更新和维护都带来了不少的困难。
C语言课程设计 职工信息管理系统 结构体数组实现程序源代码
//C语言课程设计职工信息管理系统—结构体数组实现#include <stdio.h>#include <stdlib.h>#include <string.h>struct employee{char num[10];char name[15];char sex[5];char bm[20];char zc[20];int gz;};int read_file(struct employee em[]);void menu();void write_file(struct employee em[]);void add();void select(); //查看职工所有信息void zc_query(); //按职称查询void num_del(); //按工号删除void tongji(); //统计void sort(); //排序void num_modify(); //按工号修改职工信息void save(); //保存信息void disp(); //显示职工信息void fh(); //返回主菜单struct employee em[300]; //这个数组用来保存所有的职工信息和文件里面的一致int Number=0; //记录总的职工人数也就是数组/文件里面的职工人数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 main(){int choose=0;FILE *fp=NULL;char yesorno;if((fp=fopen("employee1.txt","rb+"))==NULL){printf("\n=========>提示:文件不存在,是否要创建一个?(y/n)\n");scanf("%c",&yesorno);if(yesorno=='y'||yesorno=='Y'){//这里仅为了建立文件fp=fopen("employee1.txt","wb+");fclose(fp); //关闭fp所指的文件,释放文件缓冲区}elseexit(0);}else{Number=read_file(em); //要是文件已经有数据将数据初始化到数组中}system("cls");while(1){menu();printf("\t\t====>请选择:");scanf("%d",&choose);system("cls");switch(choose){case 0:exit(0); //退出break;case 1:add();fh();//增加职工信息 break;case 2:select();fh();//查看职工信息 break;case 3:zc_query();fh();// 查找break;case 4:num_del();fh();//删除break;case 5:tongji();fh();//统计break;case 6:sort();fh();//排序break;case 7:num_modify();fh();//修改后返回 break;case 8:save();fh();//保存break;case 9:disp();fh();break;//显示default:break;}fflush(stdin);getchar();system("cls");}}void save(){printf("\t=====程序在运行时已自动保存.....\n");}void fh(){printf("\t===>按Enter键返回主菜单\n");}void num_modify() //修改职工信息{FILE *fp=NULL;char gh[60];int i=0;int changeIndex=0; //changeIndex 改变标记int index=0;printf("请输入要修改的职工工号:");scanf("%s",gh);for (i=0;i<Number;i++){if (strcmp(gh,em[i].num)==0) //比较输入工号和数组中已有工号{changeIndex=i; //保存要修改的人的下标break;}}printf("\t工号\t姓名\t性别\t部门\t职称\t工资\n");printf("\t%s\t%s\t%s\t%s\t%s\t%d\n\n",em[changeIndex].num,em[chan geIndex].name,em[changeIndex].sex,em[changeIndex].bm,em[changeIndex]. zc,em[changeIndex].gz);printf("请重新输入该职工信息");printf("工号:");scanf("%s",em[changeIndex].num);printf("姓名:");scanf("%s",em[changeIndex].name);printf("性别:");scanf("%s",em[changeIndex].sex);printf("部门:");scanf("%d",em[changeIndex].bm);printf("职称:");scanf("%s",em[changeIndex].zc);printf("工资:");scanf("%d",&em[changeIndex].gz);//信息修改后重新更新文件里面的数据以保持数据一致性fp=fopen("employee1.txt","wb+");for (i=0;i<Number;i++){fwrite(&em[i],sizeof(struct employee),1,fp); //把ptr所指向n*size个字节输入到fp所指向的文件中}fclose(fp);printf("\t=======>修改成功\n");}void disp() //输出所有职工信息{int i=0;for (i=0;i<Number;i++){printf("\t%s\t%s\t%s\t%s\t%s\t%d\n\n",em[i].num,em[i].name,em[i]. sex,em[i].bm,em[i].zc,em[i].gz);}}void sort()//排序{struct employee t;int wantNUmber=0;int i=0;int j=0;int k=0;for(i=0;i<Number-1;i++){k=i;for(j=i+1;j<Number;j++){if(em[j].gz>em[k].gz)k=j;}if(k!=i){t=em[i];em[i]=em[k];em[k]=t;}}printf("你想输出前几名职工的信息:");scanf("%d",&wantNUmber);if (wantNUmber>Number){wantNUmber=Number;}printf("\t工号\t姓名\t性别\t部门\t职称\t工资\n");for(i=0;i<wantNUmber;i++){printf("\t%s\t%s\t%s\t%s\t%s\t%d\n\n",em[i].num,em[i].name,em[i].sex, em[i].bm,em[i].zc,em[i].gz);}}void tongji()//统计{int i,m,k,max,min;double sum=0.0;for(i=0;i<Number;i++){sum=sum+em[i].gz;}printf("全体职工的总工资为:%f\n",sum);printf("平均工资为:%f\n",sum/Number);i=0;m=0;max=0;max=em[m].gz;for(i=1;i<Number;i++){if (em[i].gz>max)m=i;max=em[m].gz;}printf("最高工资为:%d\n",max);printf("\t%s\t%s\t%s\t%s\t%s\t%d\n\n",em[m].num,em[m].name,em[m]. sex,em[m].bm,em[m].zc,em[m].gz);i=0;k=0;min=0;min=em[0].gz;for(i=1;i<Number;i++){if (em[i].gz<min)k=i;min=em[k].gz;}printf("最低工资:%d\n",min);printf("\t%s\t%s\t%s\t%s\t%s\t%d\n\n",em[k].num,em[k].name,em[k]. sex,em[k].bm,em[k].zc,em[k].gz);}void num_del()//按工号删除FILE *fp=NULL;char gh[60];int i=0;int j=0;printf("请输入要删除的职工工号:");scanf("%d",gh);for(i=0;i<Number;i++){if (strcmp(gh,em[i].num)==0) //如果查找到就删除{for (j=i;j<Number-1;j++){em[j]=em[j+1];}Number--;}}//将剩余数据写入文件重新一写的方式打开文件把以前的数据擦除了fp=fopen("employee1.dat","wb");for (i=0;i<Number;i++){fwrite(&em[i],sizeof(struct employee),1,fp);}fclose(fp);printf("删除成功;\n");}void zc_query()//按职称查找{char zc[20];int i=0;printf("请输入要查找职工职称:");scanf("%s",zc);system("cls");printf("\t工号\t姓名\t性别\t部门\t职称\t工资\n");for (i=0;i<Number;i++){if (strcmp(zc,em[i].zc)==0){printf("\t%s\t%s\t%s\t%s\t%s\t%d\n\n",em[i].num,em[i].name,em[i]. sex,em[i].bm,em[i].zc,em[i].gz);}}void select()//查看职工{int i=0;printf("以下是全部职工信息\n");printf("\t工号\t姓名\t性别\t部门\t职称\t工资\n");for(i=0;i<Number;i++){printf("\t%s\t%s\t%s\t%s\t%s\t%d\n\n",em[i].num,em[i].name,em[i]. sex,em[i].bm,em[i].zc,em[i].gz);}}void add()//增加职工{int numberTemp=0;int i=0;struct employee temp; //临时保存信息printf("请输入要增加职工信息的个数:");scanf("%d",&numberTemp);for(i=0;i<numberTemp;i++){printf("输入第%d个职工信息\n",i+1);printf("工号:");scanf("%s",temp.num);printf("姓名:");scanf("%s",);printf("性别:");scanf("%s",temp.sex);printf("部门:");scanf("%s",temp.bm);printf("职称:");scanf("%s",temp.zc);printf("工资:");scanf("%d",&temp.gz);em[Number++]=temp; //将刚添加的写入到数组write_file(&temp); //将刚添加的写入到文件}printf("添加成功\n");}void write_file(struct employee *em){FILE *fp=NULL;fp=fopen("employee1.txt","rb+");fwrite(em,sizeof(struct employee),1,fp);fclose(fp);}int read_file(struct employee em[]){FILE *fp=NULL;int i=0;fp=fopen("employee1.txt","rb");while(fread(&em[i],sizeof(struct employee),1,fp)) i++;fclose(fp);return i;}。
单链表(员工信息管理)
{
printf("%.1f->",p->salary);
}
p=p->nextnode;
}
printf("NULL");
printf("\n");
}
void Node::showNodeNO()
{
Node *p = this->nextnode;
}
int val3=0;
float sa1=0;
printf("\n");
printf("请输入要设置工资员工的编号: ");
scanf("%d",&val3);
printf("请输入要设置工资: ");
scanf("%f",&sa1);
printf("\n");
// Node *pNew = (Node*)malloc(sizeof(Node));
// pNew->data = val;
// pNew->next = pCur->next;
// pCur->next = pNew;
break;
}
SETADD=true;
while(pCur)
{
p = pCur;
pCur = pCur->nextnode;
free(p);
}
printf("链表已删除 !!!!\n");
p=NULL;
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),因为可以与后继结点交换数据域,然后删除后继结点。
数据结构单链表课程设计设计报告
数据结构单链表课程设计设计报告《数据结构》课程设计报告1)需求分析此程序主要用来实现单链表的创建、插入、删除、排序、并、交、差运算及输出等基本操作。
程序需要根据使用者的需要来运算得出符合要求的结果①在程序运行的过程中根据提示进行输入,使用了scanf函数;②使用了printf函数进行输出;③程序输出符合使用者的需要的结果;④程序能够输出任意运算的正确结果。
2)概要设计1. 定义所需的数据结构data *nexttypedef struct LNode{int data; //数据域struct LNode *next; //指针域}LNode, *LinkList;2. 模块划分void LinkListCreat(LinkList &L,int n); //创建void ListInsert(LinkList head,int i,int e); //插入void ListDelete(LinkList head,int i,int e); //删除void printList(LinkList &head); //输出2void LinkListsort(LinkList &L); //排序void LinkListMerge(LinkList &La, LinkList&Lb,LinkList &Lc); //并void LinkListJiao(LinkList &La, LinkList &Lb,LinkList&Lc); //交void LinkListcha(LinkList &La, LinkList &Lb,LinkList&Lc); //差void LinkListhebing(LinkList&La, LinkList &Lb,LinkList &Lc); //差集的并void main(); //主函数,分别调用以上的子函数3 .功能设计首先利用元素逆序插入法建立链表,然后导出菜单,用switch调用各个子函数,实现链表的创建,插入,删除,排序,交,并,差等运算,其中排序用的是冒泡法。
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.编程中遇到的困难及解决方法温故而知新,可以为师矣。
C语言课程设计——职工管理程序(链表实现)
/********************************头文件调用*********************************************/#include "stdio.h"#include "stdlib.h"#include "string.h"#include "conio.h"/********************************结构体声明*********************************************//********************************职工信息结构体*****************************************/struct Employee; //职工信息结构体声明typedef struct Employee *PtrToNode; //结构体指针定义typedef PtrToNode List; //链表头指针定义typedef PtrToNode Position; //链表结点指针定义/********************************职称结构体*****************************************/struct Title; //职称结构体声明typedef struct Title *PtrToTitle; //结构体指针定义/********************************函数声明************************************************//********************************链表函数声明********************************************/List MakeEmpty(List L); //空链表创建函数int IsEmpty(List L); //判断空链表函数int IsLast(Position P,List L); //判断链尾函数void DeleteList(List L); //链表删除函数Position FindNumPrevious(int number,List L); //职工号前驱指针查找函数Position FindNamePrevious(char name[],List L); //职工姓名前驱指针查找函数List Sort(List L); //链表冒泡排序函数PtrToTitle MakeEmptyTitle(PtrToTitle L1); //空职称链表创建函数PtrToTitle InsertTitle(char t[20],PtrToTitle L1); //职称插入函数/********************************文件函数声明********************************************/List Init(List L); //初始化函数void Save(List L); //信息保存函数void MakeFileEmpty(); //清空文件函数/********************************菜单函数声明********************************************/void MainMeun(); //主菜单void ViewMeun(); //显示菜单void EmployeeMeun(); //职工信息显示菜单void ModMeun(); //修改菜单void ModMeun1(); //修改的部分菜单void ModMeun(); //删除菜单/********************************职工管理函数声明********************************************/void Add(List L); //信息录入函数void View(List L); //信息显示函数void ViewNum(List L); //职工号显示函数void ViewName(List L); //职工号显示函数void ViewEmployee(List L); //职工信息显示函数void ViewDepartment(List L); //部门信息显示函数void ViewTime(List L); //入厂时间显示函数void Mod(List L); //信息修改函数void Mod1(Position P,List L); //修改的部分函数void ModNum(Position P,List L); //职工号修改函数void ModName(Position P,List L); //职工姓名修改函数void ModDepartment(Position P,List L); //工作部门修改函数void ModTitle(Position P,List L); //职工职称修改函数void ModTime(Position P,List L); //入厂时间修改函数void Modmoney(Position P,List L); //职工工资修改函数void Delete(List L); //职工号删除函数void DeleteNum(List L); //职工号删除函数void DeleteName(List L); //职工姓名删除函数void PrintEmployee(Position P); //职工信息打印函数void TurnBack(); //返回上一菜单函数char Test1(char a,char b,char c); //菜单输入检测函数/*********************************结构体定义***********************************************///职工信息结构体struct Employee{int num; //职工号char name[20]; //姓名char department[20]; //工作部门char Title[20]; //职称char time[10]; //入厂时间年/月/日 2018/6/29int money; //工资Position Next; //Next指针 (指向下一结构体)};//职称结构体struct Title{char title[20]; //职称名称int num; //部门职称人数struct Title* Next; //Next指针};/*********************************函数定义**************************************************//*********************************主函数**************************************************/int main(){List L=NULL;char a;L=Init(L);printf("\n\t\t输入回车键继续");getchar();while(1){system("cls"); //实现清屏MainMeun(); //调用主菜单显示函数fflush(stdin); //清除键盘缓冲区a=Test1(getchar(),'1','7'); //菜单输入检测函数switch(a){case '1': system("cls"); Add(L); break; //调用信息录入函数case '2': system("cls"); View(L); break; //调用信息显示函数case '3': system("cls"); Mod(L); break; //调用信息修改函数case '4': system("cls"); Delete(L); break; //调用信息删除函数case '5': system("cls"); Save(L); system("pause"); break; //调用信息保存函数case '6': system("cls"); MakeFileEmpty(); break; //调用信息删除函数case '7': return 0; //退出系统}}return 0;}/*********************************链表函数**********************************************///空链表创建函数List MakeEmpty(List L){if(L) //相当于 if(L!=NULL) ,即指针L指向的空间不为空DeleteList( L ); //删除原先链表L=(List)malloc(sizeof(struct Employee)); //创建新的空链表if(!L) //相当于 if(L==NULL) ,即指针L指向的空间为空{printf("创建失败,内存不足!!!"); //创建失败,提示内存不足system("pause"); //暂停屏幕显示return NULL; //返回上一级菜单}L->Next=NULL; //Next指针指向空return L; //返回链表头}//空职称链表创建函数struct Title *MakeEmptyTitle(struct Title *L1){if(L1) //相当于 if(L!=NULL) ,即指针L指向的空间不为空{struct Title *P;P=L1->Next; //取链表头后的所有结点L1->Next=NULL; //链表头指向空结点while(P!=NULL) //依次释放链表头后所有结点的空间{free(P);P=P->Next;}}L1=(struct Title *)malloc(sizeof(struct Title)); //创建新的空链表if(!L1) //相当于 if(L==NULL) ,即指针L指向的空间为空{printf("创建失败,内存不足!!!"); //创建失败,提示内存不足system("pause"); //暂停屏幕显示return NULL; //返回上一级菜单}L1->Next=NULL; //Next指针指向空return L1; //返回链表头}//职称插入函数PtrToTitle InsertTitle(char t[20],PtrToTitle L1){PtrToTitle P,TmpCell;if(L1->Next==NULL) //如果职称链表为空,则直接创建结点{TmpCell=(PtrToTitle)malloc(sizeof(struct Title));if(TmpCell==NULL)printf("\n超出空间!!!\n\n");else //将新建结点插入链表{strcpy(TmpCell->title,t);TmpCell->Next=L1->Next;L1->Next=TmpCell;TmpCell->num=1;}}else{P=L1->Next;while(P!=NULL&&strcmp(P->title,t)!=0)P=P->Next;if(P==NULL){TmpCell=(PtrToTitle)malloc(sizeof(struct Title));if(TmpCell==NULL)printf("\n超出空间!!!\n\n");else //将新建结点插入链表{strcpy(TmpCell->title,t);TmpCell->Next=L1->Next;L1->Next=TmpCell;TmpCell->num=1;}}elseP->num++;}return L1;}//判断空链表函数int IsEmpty(List L){return L->Next==NULL; //头结点的Next指针为空,则链表为空,返回值为1 }//判断链尾函数int IsLast(Position P,List L){return P->Next==NULL; //结点P的Next指针为空,则P为最后一个结点,返回值为1}//链表删除函数void DeleteList(List L){Position P;P=L->Next; //取链表头后的所有结点L->Next=NULL; //链表头指向空结点while(P!=NULL) //依次释放链表头后所有结点的空间{free(P);P=P->Next;}}//职工号前驱指针查找函数Position FindNumPrevious(int number,List L){Position P;P=L;while(P->Next!=NULL&&P->Next->num!=number) //判断P的Next指针是否为空,且P 的下一个结点的职工号是否为查找的职工号P=P->Next; //查找下一个return P; //返回该职工号的前驱指针}//职工姓名前驱指针查找函数Position FindNamePrevious(char name[],List L){Position P;P=L;while(P->Next!=NULL&&strcmp(name,P->Next->name)!=0) //判断P的Next指针是否为空,且P的下一个结点的职工姓名是否为查找的职工姓名P=P->Next; //查找下一个return P; //返回该职工号的前驱指针}//链表冒泡排序函数List Sort(List L){Position P,Tmp1,Tmp2;int i,j,num=0;P=L->Next;while(P!=NULL) //获取总人数{num++;P=P->Next;}for(j=0;j<num-1;j++) //通过总人数控制循环{P=L;Tmp1=P->Next;Tmp2=Tmp1->Next;for(i=0;i<num-1-j;i++){if(Tmp1->num>Tmp2->num) //升序{Tmp1->Next=Tmp2->Next;P->Next=Tmp2;Tmp2->Next=Tmp1;}P=P->Next;Tmp1=P->Next;Tmp2=Tmp1->Next;}}return L;}/*********************************文件函数**************************************************///初始化函数List Init(List L){FILE *fp; //文件指针Position TmpCell;int num=0;if((fp=fopen("职工信息.txt","r+"))==NULL) //打开"职工信息.txt"文本文件{printf("\n\t\t无法打开文件或文件不存在\n"); //提示错误printf("\n\t\t正在尝试创建新文件....\n");fp=fopen("职工信息.txt","w"); //创建"职工信息.txt"文本文件if((fp=fopen("职工信息.txt","r+"))==NULL) //再次打开判断是否成功{printf("\t\t文件创建失败!!!\n");system("pause"); //暂停屏幕显示return NULL;}}fp=fopen("职工信息.txt","r+"); //以只读的方式打开"职工信息.txt"文本文件L=MakeEmpty(L); //创建链表,以便存储文本文件中的信息while(1) //将磁盘中的信息输出到内存中{TmpCell=(Position)malloc(sizeof(struct Employee)); //创建新结点if(TmpCell==NULL){printf("文件信息读取失败,系统内存不足!!!\n"); //添加失败,提示内存不足system("pause"); //暂停屏幕显示return NULL; //返回上一级菜单if(fscanf(fp,"%d %s %s %s %s %d",&TmpCell->num,TmpCell->name,TmpCell->depa rtment,TmpCell->Title,TmpCell->time,&TmpCell->money)<0)break; //将文件信息写入内存TmpCell->Next=L->Next; //将结点TmpCell插入到链表中L->Next=TmpCell;num++;}printf("\n\t\t职工信息读取完成!!!\n");printf("\n\t\t目前共有 %d 名职工信息\n",num);fclose(fp); //关闭文件return L;}//信息保存函数void Save(List L){FILE *fp; //文件指针Position P;L=Sort(L); //调用链表冒泡排序函数P=L;if((fp=fopen("职工信息.txt","w+"))==NULL) //打开"职工信息.txt"文本文件{printf("无法打开文件!!!\n");system("pause"); //暂停屏幕显示return;}fp=fopen("职工信息.txt","w+"); //以读写的方式打开"职工信息.txt"文本文件while(P->Next!=NULL) //将内存中的数据输出到磁盘中{P=P->Next; //信息从第一个有效结点开始保存,循环指向下一个有效结点if(fprintf(fp,"%d %s %s %s %s %d\n",P->num,P->name,P->department,P->Title, P->time,P->money)<0)break; //向文件写入信息}printf("\n职工信息保存成功!!!\n\n");fclose(fp);}//清空文件函数void MakeFileEmpty(){FILE *fp; //文件指针if((fp=fopen("职工信息.txt","w+"))==NULL) //新建"职工信息.txt"文本文件{printf("无法打开文件!!!\n");system("pause"); //暂停屏幕显示return;}printf("\n文件信息清空完毕!!!\n\n");TurnBack();return;}/*********************************菜单函数**************************************************///主菜单void MainMeun(){printf("\n\t\t 主菜单");printf("\n\t\t*******************************************");printf("\n\t\t* 1、信息录入 *");printf("\n\t\t* 2、信息显示 *");printf("\n\t\t* 3、信息修改 *");printf("\n\t\t* 4、信息删除 *");printf("\n\t\t* 5、信息保存 *");printf("\n\t\t* 6、信息清空 *");printf("\n\t\t* 7、退出系统 *");printf("\n\t\t*******************************************");printf("\n\n\t\t\t请输入您的选择:");}//显示菜单void ViewMeun(){printf("\n\t\t 显示菜单");printf("\n\t\t********************************************");printf("\n\t\t* 1、职工信息显示 *");printf("\n\t\t* 2、部门信息显示 *");printf("\n\t\t* 3、入厂时间显示 *");printf("\n\t\t* 4、返回到主菜单 *");printf("\n\t\t********************************************");printf("\n\n\t\t\t请输入您的选择:");}//职工信息显示菜单void EmployeeMeun(){printf("\n\t\t 职工信息显示菜单");printf("\n\t\t********************************************");printf("\n\t\t* 1、职工号查询 *");printf("\n\t\t* 2、职工姓名查询 *");printf("\n\t\t* 3、返回显示菜单 *");printf("\n\t\t********************************************");printf("\n\n\t\t\t请输入您的选择:");}//修改菜单void ModMeun(){printf("\n\t\t 修改菜单");printf("\n\t\t********************************************");printf("\n\t\t* 1、职工号查询修改 *");printf("\n\t\t* 2、职工姓名查询修改 *");printf("\n\t\t* 3、返回到主菜单 *");printf("\n\t\t********************************************");printf("\n\n\t\t\t请输入您的选择:");}//修改的部分菜单void ModMeun1(){printf("\n\t\t 所要修改的部分");printf("\n\t\t********************************************");printf("\n\t\t* 1、职工号 *");printf("\n\t\t* 2、职工姓名 *");printf("\n\t\t* 3、工作部门 *");printf("\n\t\t* 4、职称 *");printf("\n\t\t* 5、入厂时间 *");printf("\n\t\t* 6、工资 *");printf("\n\t\t* 7、返回上一菜单 *");printf("\n\t\t********************************************");printf("\n\n\t\t\t请输入您的选择:");}//删除菜单void DeleteMeun(){printf("\n\t\t 删除菜单");printf("\n\t\t********************************************");printf("\n\t\t* 1、职工号查询删除 *");printf("\n\t\t* 2、职工姓名查询删除 *");printf("\n\t\t* 3、返回到主菜单 *");printf("\n\t\t********************************************");printf("\n\n\t\t\t请输入您的选择:");}/*********************************职工管理函数**************************************************//*********************************录入函数**********************************************///信息录入函数void Add(List L){Position TmpCell;int number;char n[20];printf("\n请输入所要创建的职工号: "); //提示输入职工号scanf("%d",&number);if(!IsLast(FindNumPrevious(number,L),L)) //连续调用职工号前驱指针查找函数判断链尾函数,判断该职工号是否已存在{printf("\n职工号 %d 已存在!!!\n\n",number);TurnBack(); //调用返回上一菜单函数return; //退出并返回上一级菜单}printf("\n请输入该职工的姓名: "); //保存职工姓名scanf("%s",n);if(!IsLast(FindNamePrevious(n,L),L)) //连续调用职工姓名前驱指针查找函数判断链尾函数,判断该职工姓名是否已存在{printf("\n职工姓名 %s 已存在!!!\n\n",n);TurnBack(); //调用返回上一菜单函数return; //退出并返回上一级菜单}TmpCell=(Position)malloc(sizeof(struct Employee)); //创建新结点if(TmpCell==NULL){printf("\n添加失败,内存不足!!!\n\n"); //添加失败,提示内存不足system("pause"); //暂停屏幕显示return; //返回上一级菜单}TmpCell->num=number; //保存职工号strcpy(TmpCell->name,n); //保存姓名printf("\n请输入该职工的工作部门: "); //保存工作部门scanf("%s",TmpCell->department);printf("\n请输入该职工的职称: "); //保存职称scanf("%s",TmpCell->Title);printf("\n请输入该职工的入厂时间(格式为:年/月/日): "); //保存入厂时间scanf("%s",TmpCell->time);printf("\n请输入该职工的工资(单位:元): "); //保存工资scanf("%d",&TmpCell->money);TmpCell->Next=L->Next; //将结点TmpCell插入到链表中L->Next=TmpCell;printf("\n职工 %s 的信息创建成功!!!\n",TmpCell->name); //提示创建成功Save(L); //调用信息保存函数TurnBack(); //调用返回上一菜单函数return; //退出并返回上一级菜单}/*********************************显示函数**********************************************///信息显示函数void View(List L){while(1){char a;system("cls"); //实现清屏ViewMeun(); //调用显示菜单fflush(stdin); //清除键盘缓冲区a=Test1(getchar(),'1','4'); //调用菜单输入检测函数switch(a){case '1': system("cls"); ViewEmployee(L); break; //职工信息显示case '2': system("cls"); ViewDepartment(L); break; //部门信息显示case '3': system("cls"); ViewTime(L); break; //入厂时间显示case '4': return;}}}//职工信息显示函数void ViewEmployee(List L){while(1){char a;system("cls"); //实现清屏EmployeeMeun(); //调用职工信息显示菜单fflush(stdin); //清除键盘缓冲区a=Test1(getchar(),'1','3'); //调用菜单输入检测函数switch(a){case '1': system("cls"); ViewNum(L); break; //职工信息显示case '2': system("cls"); ViewName(L); break; //部门信息显示case '3': return;}}}//职工号显示函数void ViewNum(List L){Position P;int number;printf("\n请输入所要查询的职工号: ");scanf("%d",&number);P=FindNumPrevious(number,L); //调用职工号前驱指针查找函数,获得所需显示结点的前一结点if(IsLast(P,L)==1) //判断是否存在该员工printf("\n无职工号为 %d 的员工!!!\n\n",number);elsePrintEmployee(P->Next); //调用职工信息打印函数TurnBack(); //调用返回上一菜单函数return; //返回上一菜单}//职工姓名显示函数void ViewName(List L){Position P;char name[20];printf("请输入所要查询的职工姓名: ");scanf("%s",name);P=FindNamePrevious(name,L); //调用职工号前驱指针查找函数,获得所需显示结点的前一结点if(IsLast(P,L)) //判断是否存在该员工printf("\n无姓名为 %s 的员工!!!\n\n",name);elsePrintEmployee(P->Next); //调用职工信息打印函数TurnBack(); //调用返回上一菜单函数return; //返回上一菜单}//部门信息显示函数void ViewDepartment(List L){Position P;PtrToTitle P1,L1;char c[20];int num,money;L1=NULL;L1=MakeEmptyTitle(L1); //调用职称链表创建函数num=money=0;printf("请输入所要查询的部门名称: ");scanf("%s",c);P=L->Next;while(P!=NULL&&strcmp(c,P->department)!=0)P=P->Next;if(P==NULL){printf("\n无名称为 %s 的部门\n\n",c);TurnBack(); //调用返回上一菜单函数return;}printf("\n该部门职工信息如下:\n");printf("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n");printf(" 职工号姓名工作部门职称入厂时间工资 \n");printf("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n");P=L->Next;while(P!=NULL){if(strcmp(c,P->department)==0){printf(" %-d\t\t%-s\t\t%-s\t\t%-s\t\t%-s\t\t%-d\n",P->num,P->name,P->dep artment,P->Title,P->time,P->money);L1=InsertTitle(P->Title,L1);num++;money+=P->money;}P=P->Next;}printf("\n\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n");printf("该部门的统计情况如下:\n 总人数为: %d 人\n 平均工资为: %.2f 元\n",num,(float)money/num);P1=L1->Next;while(P1!=NULL){printf(" 职称为 %s 的共: %d 人\n",P1->title,P1->num);P1=P1->Next;}putchar('\n');TurnBack(); //调用返回上一菜单函数return; //退出并返回上一级菜单}//入厂时间显示函数void ViewTime(List L){Position P;char time[20];printf("请输入所要查询的入厂时间: ");scanf("%s",time);P=L->Next;while(P!=NULL&&strcmp(time,P->time)!=0)P=P->Next;if(P==NULL){printf("无入厂时间为 %s 的员工\n\n",time);TurnBack(); //调用返回上一菜单函数return;}printf("\n该部门职工信息如下:\n");printf("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n");printf(" 职工号姓名工作部门职称入厂时间工资 \n");printf("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n");P=L->Next;while(P!=NULL){if(strcmp(time,P->time)==0)printf(" %-d\t\t%-s\t\t%-s\t\t%-s\t\t%-s\t\t%-d\n",P->num,P->name,P->dep artment,P->Title,P->time,P->money);P=P->Next;}printf("\n\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n");TurnBack(); //调用返回上一菜单函数return;}/*********************************修改函数**********************************************///信息修改函数void Mod(List L){while(1){char a;Position P;system("cls"); //实现清屏ModMeun(); //调用修改菜单fflush(stdin); //清除键盘缓冲区a=Test1(getchar(),'1','3'); //调用菜单输入检测函数switch(a){case '1': //职工号修改{int number;system("cls");printf("\n请输入所要修改的职工信息的职工号: ");scanf("%d",&number);P=FindNumPrevious(number,L); //调用职工号前驱指针查找函数,获得所需显示结点的前一结点if(IsLast(P,L)==1) //判断是否存在该员工{printf("\n无职工号为 %d 的员工!!!\n\n",number);TurnBack(); //调用返回上一菜单函数}elseMod1(P->Next,L); //调用修改的部分函数break; //返回上一菜单}case '2': //职工姓名修改{char name[20];printf("请输入所要修改的职工信息的职工姓名: ");scanf("%s",name);P=FindNamePrevious(name,L); //调用职工号前驱指针查找函数,获得所需显示结点的前一结点if(IsLast(P,L)) //判断是否存在该员工{printf("\n无姓名为 %s 的员工!!!\n\n",name);TurnBack(); //调用返回上一菜单函数}elseMod1(P->Next,L);break; //返回上一菜单}case '3': return;}}}//修改的部分函数void Mod1(Position P,List L){while(1){char a;PrintEmployee(P); //调用职工信息打印函数ModMeun1(); //调用修改菜单fflush(stdin); //清除键盘缓冲区a=Test1(getchar(),'1','7'); //调用菜单输入检测函数switch(a){case '1': system("cls"); ModNum(P,L); break; //职工号修改case '2': system("cls"); ModName(P,L); break; //职工姓名修改case '3': system("cls"); ModDepartment(P,L); break; //工作部门修改case '4': system("cls"); ModTitle(P,L); break; //职工职称修改case '5': system("cls"); ModTime(P,L); break; //入厂时间修改case '6': system("cls"); Modmoney(P,L); break; //职工工资修改case '7': return;}}}//职工号修改函数void ModNum(Position P,List L){int b;printf("\n请输入新的职工号: ");scanf("%d",&b);if(!IsLast(FindNumPrevious(b,L),L)) //连续调用职工号前驱指针查找函数判断链尾函数,判断该职工号是否已存在printf("\n职工号 %d 已存在!!!\n\n",b);else{P->num=b;Save(L); //调用信息保存函数}TurnBack(); //调用返回上一菜单函数return; //退出并返回上一级菜单}//职工姓名修改函数void ModName(Position P,List L){char c[20];printf("\n请输入新的职工姓名: ");scanf("%s",c);if(!IsLast(FindNamePrevious(c,L),L)) //连续调用职工姓名前驱指针查找函数判断链尾函数,判断该职工姓名是否已存在printf("\n职工姓名 %s 已存在!!!\n\n",c);else{strcpy(P->name,c);Save(L); //调用信息保存函数}TurnBack(); //调用返回上一菜单函数return; //退出并返回上一级菜单}//工作部门修改函数void ModDepartment(Position P,List L){char c[20];printf("\n请输入新的工作部门: ");scanf("%s",c);strcpy(P->department,c);Save(L); //调用信息保存函数TurnBack(); //调用返回上一菜单函数return; //退出并返回上一级菜单}//职工职称修改函数void ModTitle(Position P,List L){char c[20];printf("\n请输入新的职工职称: ");scanf("%s",c);strcpy(P->Title,c);Save(L); //调用信息保存函数TurnBack(); //调用返回上一菜单函数return; //退出并返回上一级菜单}//入厂时间修改函数void ModTime(Position P,List L){char c[20];printf("\n请输入新的入厂时间(格式为:年/月/日): ");scanf("%s",c);strcpy(P->time,c);Save(L); //调用信息保存函数TurnBack(); //调用返回上一菜单函数return; //退出并返回上一级菜单}//职工工资修改函数void Modmoney(Position P,List L){int b;printf("\n请输入新的职工工资(单位:元): ");scanf("%d",&b);P->money=b;Save(L); //调用信息保存函数TurnBack(); //调用返回上一菜单函数return; //退出并返回上一级菜单}/*********************************删除函数**********************************************///删除函数void Delete(List L){while(1){char a;system("cls"); //实现清屏DeleteMeun(); //调用删除菜单fflush(stdin); //清除键盘缓冲区a=Test1(getchar(),'1','3'); //调用菜单输入检测函数switch(a){case '1': system("cls"); DeleteNum(L); break; //职工号删除case '2': system("cls"); DeleteName(L); break; //职工姓名删除case '3': return;}}}//职工号删除函数void DeleteNum(List L){Position P,TmpCell;int number;printf("\n请输入所要修改的职工信息的职工号: ");scanf("%d",&number);P=FindNumPrevious(number,L); //调用职工号前驱指针查找函数,获得所需显示结点的前一结点if(IsLast(P,L)==1) //判断是否存在该员工printf("\n无职工号为 %d 的员工!!!\n\n删除失败!!!\n\n",number);else{PrintEmployee(P->Next); //调用职工信息打印函数fflush(stdin); //清除键盘缓冲区printf("\n是否确认要删除?回复'Y'/'N'\n");if(getchar()=='Y'){TmpCell=P->Next;P->Next=TmpCell->Next;free(TmpCell);printf("\n删除成功!!!\n\n");Save(L); //调用信息保存函数}}TurnBack(); //调用返回上一菜单函数return; //退出并返回上一级菜单}//职工姓名删除函数void DeleteName(List L){Position P,TmpCell;char name[20];printf("请输入所要查询的职工姓名: ");scanf("%s",name);P=FindNamePrevious(name,L); //调用职工号前驱指针查找函数,获得所需显示结点的前一结点if(IsLast(P,L)) //判断是否存在该员工printf("\n无姓名为 %s 的员工!!!\n\n删除失败!!!\n\n",name);else{PrintEmployee(P->Next); //调用职工信息打印函数fflush(stdin); //清除键盘缓冲区printf("\n是否确认要删除?回复'Y'/'N'\n");if(getchar()=='Y'){TmpCell=P->Next;P->Next=TmpCell->Next;free(TmpCell);printf("\n删除成功!!!\n\n");Save(L); //调用信息保存函数}}TurnBack(); //调用返回上一菜单函数return; //退出并返回上一级菜单}/*********************************打印函数**********************************************///职工信息打印函数void PrintEmployee(Position P){printf("\n该职工信息如下:\n");printf("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n");printf(" 职工号姓名工作部门职称入厂时间工资\n");printf("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n");printf(" %-d\t %-s %-s %-s\t%-s %-d\n",P->num,P->name,P->department,P->Title,P->time,P->money);printf("\n\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n");}/*********************************检测函数**********************************************///菜单输入检测函数char Test1(char a,char b,char c){while(a<b||a>c){printf("\n\t\t\t输入错误,请重新输入: ");fflush(stdin); //清除键盘缓冲区a=getchar();}return a;}//返回上一菜单函数void TurnBack(){printf("按回车键返回上一菜单...");fflush(stdin); //清除键盘缓冲区getchar(); //读取任意按键值system("cls"); //实现清屏}。
数据结构课程设计 简单的职工管理系统
数据结构课程设计题目名称:简单的职工管理系统计算机科学与技术学院一.需求分析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){//创建一个带头节点的空链表。
数据结构课程设计之职工工资管理系统(2)
**大学数据结构课程设计报告题目:院(系):计算机工程学院学生姓名:班级:学号:起迄日期:2011.6.20-2011.7.01指导教师:2010—2011年度第 2 学期一、需求分析1.问题描述对单位的职工进行管理,包括插入、删除、查找、排序等功能。
2.基本功能要求职工对象包括姓名、性别、出生年月、工作年月、学历、职务、住址、电话等信息。
(1)新增一名职工:将新增职工对象按姓名以字典方式职工管理文件中。
(2)删除一名职工:从职工管理文件中删除一名职工对象。
(3)查询:从职工管理文件中查询符合某些条件的职工。
(4)修改:检索某个职工对象,对其某些属性进行修改。
(5)排序:按某种需要对职工对象文件进行排序。
3.输入和输出输入和输出,根据输入提示,输入数字或输入长度最长10字符串二、概要设计1.设计思路根据职工管理系统问题的描述和详细需求分析,要达到上述功能,链表的数据结构来存储职工信息,并对其进行相应的插入、删除、修改、查询、排序、保存等操作。
(1)输入功能的实现:要想实现职工管理系统的输入,必须要建立一个职工信息系统的抽象数据类型,其中职工信息以链表的存储方式实现。
(2)系统处理功能的实现:系统管理员根据公司的人员流动情况,在提示信息的提示下,选择相应的服务进行操作。
(3)输出的实现:根据选择的操作,输出与之对应的信息。
(4)根据职工管理系统问题的分析和设计要求,可以得到该职工管理系统可以分为五个模块:职工信息添加模块、职工信息修改模块、职工信息删除模块、职工信息查询模块、职工信息排序模块2.数据结构设计依据给定的数据格式,个人信息由九个字段来组成,即编号、姓名、性别、生日、学历、工龄,职务、电话和住址,外加一个判断关键字。
使用线性结构来组织数据,因为数据占据空间比较大,要对表中某项数据进行操作,所以使用链表比较方便。
(1)定义头结点typedef struct node{char id[10];char name[10];char sex[10];char birth[10]char gl[10];char xueli[10];char zhiwu[10];char phone[10];char address[10];struct node *next;}node,*linklist;(2)基本操作操作int initlist(linklist &L) //建立链表int creatlist(linklist &L) //创建职工信息:int del(linklist &L,char id[10]) //删除职工信息:int searchid(linklist &L,char id[10])//查找职工信息void display(linklist &L)//显示职工信息:3.软件结构设计三、详细设计1.程序中所用到的函数原型,操作实现//初始化链表int initlist(linklist &L){L=(linklist)malloc(sizeof(node));if(!L)return (0);L->next=NULL;return 1;}//创建链表信息int creatlist(linklist &L){ linklist p;p=(linklist)malloc(sizeof(node));scanf(q->data); }p->next=L->next;L->next=p;return(0);}//显示函数实现void display(linklist &L){linklist p;for(p=L->next;p;p=p->next){ printf(p-.>data)//输出职工信息}}//删除int del(linklist &L,char a[10]) //按id删除4{ node *p, *r;声明节点指针p=L->next;r=L;while(p)//节点不为空{if(strcmp(p->a,a)==0){ i=1; r->next=p->next;free(p);//释放查找到的节点printf("删除成功\n");break;}r=p;p=p->next;}if(i==0)printf ("找不到需要删除的信息!\n");return 1;}//查找操作的实现int searchid(linklist &L,char a[10]){node *p;p=L;while(p){if(strcmp(p->a,a)==0){printf(p-.>data)//输出职工信息}p=p->next;}return 1;}2.主函数和其他函数的伪码算法;2.(1)主函数的伪码void main(){ linklist L;initlist(L);while(x)//{ scanf(y) //输入选择数字switch(y){case 1: creatlist(L);break;case 2: scanf(,&id);//输入员工编号xiugai(L,id);//调用修改函数case 3:scanf("%s",&id);// 输入删除员工编号del(L,id);//调用删除函数case 4:scanf(,&a);// 请输入查询方式if(a==1){scanf(&id);//输入员工编号searchid(L,id);//调用查找函数if(a==2){scanf(&name);// 输入查询员工姓名searchname(L,name); //调用查找函数}case 5:scanf("%d",&k)//输入排序方式switch(k)//输入选择{ case 1: sortid(L)//调用排序函数case 2: sortnm(L) //调用排序函数case 3: sortgl(L) //调用排序函数}case 6: display(L)//调用显示函数case 7: save(L);// /调用保存函数case8 :xinlist(L);//调用修改函数case 9:L=load(L); 调用载入函数}2.1新增信息int xinlist(linklist &L)//职工信息的插入姓名并按照升序排列{q=(linklist)malloc(sizeof(node));//申请新节点{scanf(,q->data) //输入员工信息}if(L->next==NULL)//如果只有链表的头结点,没有其他的结点,直接插入在头结点后面{L->next=q;q->next=NULL;}else{if(strcmp(L->next->name,q->name)>0)//位于链表头结点之后的位置{q->next=L->next;L->next=q;}for(p=L->next;p;p=p->next){ if(p->next!=NULL){if(strcmp(p->name,q->name)<0&&strcmp(p->next->name,q->name)>0)//位于两个结点之间{q->next=p->next;p->next=q; }else if(strcmp(p->name,q->name)<0&&p->next==NULL)//链表非空,并且在排序中是最后一个{p->next=q;q->next=NULL;break;}}}}return (0);}2.2修改信息int xiugai(linklist &L,char a[10]){ node *p;//声明节点指针p=L;while(p){if(strcmp(p->a,a)==0)//查找符合要求的员工信息{ i=1; //找到后i=i,做标志scanf(q->data) //输入员工信息p=p->next;}if(i==0)printf("不存在修改的学生!\n");elseprintf("修改成功!\n");return 1;}2.3排序信息程序void sort(linklist &L){linklist La;//声明节点指针linklist p,q,m;//声明节点指针La=(linklist)malloc(sizeof(node));申请新节点La->next =NULL;while(L->next){for(q=L->next ,p=L->next ;p->next ;p=p->next )//依次选出工龄最大的节点{if((strcmp( p->next->a,q->a ))>0 ){m=p;q=p->next ; }}if(q==L->next)//删除符合的节点{L->next =L->next->next ;}else{m->next =q->next ;}q->next =La->next ;//建立新链表La->next =q ;}L=La;display(L);//调用显示函数}2.4保存信息伪码void save(linklist &L) //7保存{FILE *fp; //定义指向文件的指针node *p; // 定义移动指针scanf(outfile)// 提示文件名格式信息if((fp=fopen(outfile,"wb"))==NULL) //为输出打开一个二进制文件,如没有则建立{printf("can not open file\n");exit(1);} p=L; //移动指针从头指针开始while(p!=NULL) //如p不为空{fwrite(p,sizeof(node),1,fp);//写入一条记录p=p->next; //指针后移 }fclose(fp); //关闭文件}2.5载入信息伪码node *load(node *L) //9载入信息{node *p,*q,*h=NULL; //定义记录指针变量FILE *fp; // 定义指向文件的指针char infile[10]; //保存文件名scanf,infile); //输入文件名if((fp=fopen(infile,"rb"))==NULL) //打开一个二进制文件,为读方式{exit(1); }p=(node *)malloc(sizeof(node)); //申请空间h=p; //申请到空间,将其作为头指针while(!feof(fp)) //循环读数据直到文件尾结束{ if(1!=fread(p,sizeof(node),1,fp))break; //如果没读到数据,跳出循环p->next=(node *)malloc(sizeof(node)); //为下一个结点申请空间q=p; //保存当前结点的指针,作为下一结点的前驱p=p->next; //指针后移,新读入数据链到当前表尾 } q->next=NULL; //最后一个结点的后继指针为空fclose(fp); //关闭文件return h; /*返回头指针*/ }3.1新增信息在新增信息中,对按姓名关键字的链表进行插入新节点。
c语言单链表程序代码
c语言单链表程序代码C语言单链表程序代码单链表是一种常见的数据结构,它由多个节点组成,每个节点包含一个数据域和一个指向下一个节点的指针。
以下是C语言实现单链表的程序代码:1. 定义节点结构体首先需要定义一个节点结构体,用来存储每个节点的数据和指针信息。
```typedef struct node {int data; // 数据域struct node *next; // 指向下一个节点的指针} Node;```2. 创建链表头节点创建一个头节点,它不存储任何数据,只是作为链表的起始点。
```Node *head = NULL;head = (Node*)malloc(sizeof(Node));head->next = NULL;```3. 插入新节点插入新节点时需要先创建一个新的节点,并将其插入到链表中合适的位置。
```Node *new_node = NULL;new_node = (Node*)malloc(sizeof(Node));new_node->data = new_data;// 找到插入位置Node *current = head;while (current->next != NULL && current->next->data < new_data) {current = current->next;}// 插入新节点new_node->next = current->next;current->next = new_node;```4. 删除指定数据的节点删除指定数据的节点时需要先找到该节点,并将其从链表中删除。
```// 找到要删除的节点Node *current = head;while (current->next != NULL && current->next->data != data) {current = current->next;}// 删除节点if (current->next != NULL) {Node *del_node = current->next;current->next = del_node->next;free(del_node);```5. 遍历链表遍历链表时需要从头节点开始,依次访问每个节点的数据。
数据结构实验报告-实验一顺序表、单链表基本操作的实现
数据结构实验报告-实验⼀顺序表、单链表基本操作的实现实验⼀顺序表、单链表基本操作的实现l 实验⽬的1、顺序表(1)掌握线性表的基本运算。
(2)掌握顺序存储的概念,学会对顺序存储数据结构进⾏操作。
(3)加深对顺序存储数据结构的理解,逐步培养解决实际问题的编程能⼒。
l 实验内容1、顺序表1、编写线性表基本操作函数:(1)InitList(LIST *L,int ms)初始化线性表;(2)InsertList(LIST *L,int item,int rc)向线性表的指定位置插⼊元素;(3)DeleteList1(LIST *L,int item)删除指定元素值的线性表记录;(4)DeleteList2(LIST *L,int rc)删除指定位置的线性表记录;(5)FindList(LIST *L,int item)查找线性表的元素;(6)OutputList(LIST *L)输出线性表元素;2、调⽤上述函数实现下列操作:(1)初始化线性表;(2)调⽤插⼊函数建⽴⼀个线性表;(3)在线性表中寻找指定的元素;(4)在线性表中删除指定值的元素;(5)在线性表中删除指定位置的元素;(6)遍历并输出线性表;l 实验结果1、顺序表(1)流程图(2)程序运⾏主要结果截图(3)程序源代码#include<stdio.h>#include<stdlib.h>#include<malloc.h>struct LinearList/*定义线性表结构*/{int *list; /*存线性表元素*/int size; /*存线性表长度*/int Maxsize; /*存list数组元素的个数*/};typedef struct LinearList LIST;void InitList(LIST *L,int ms)/*初始化线性表*/{if((L->list=(int*)malloc(ms*sizeof(int)))==NULL){printf("内存申请错误");exit(1);}L->size=0;L->Maxsize=ms;}int InsertList(LIST *L,int item,int rc)/*item记录值;rc插⼊位置*/ {int i;if(L->size==L->Maxsize)/*线性表已满*/return -1;if(rc<0)rc=0;if(rc>L->size)rc=L->size;for(i=L->size-1;i>=rc;i--)/*将线性表元素后移*/L->list[i+=1]=L->list[i];L->list[rc]=item;L->size++;return0;}void OutputList(LIST *L)/*输出线性表元素*/{int i;printf("%d",L->list[i]);printf("\n");}int FindList(LIST *L,int item)/*查找线性元素,返回值>=0为元素的位置,返回-1为没找到*/ {int i;for(i=0;i<L->size;i++)if(item==L->list[i])return i;return -1;}int DeleteList1(LIST *L,int item)/*删除指定元素值得线性表记录,返回值为>=0为删除成功*/ {int i,n;for(i=0;i<L->size;i++)if(item==L->list[i])break;if(i<L->size){for(n=i;n<L->size-1;n++)L->list[n]=L->list[n+1];L->size--;return i;}return -1;}int DeleteList2(LIST *L,int rc)/*删除指定位置的线性表记录*/{int i,n;if(rc<0||rc>=L->size)return -1;for(n=rc;n<L->size-1;n++)L->list[n]=L->list[n+1];L->size--;return0;}int main(){LIST LL;int i,r;printf("list addr=%p\tsize=%d\tMaxsize=%d\n",LL.list,LL.size,LL.Maxsize);printf("list addr=%p\tsize=%d\tMaxsize=%d\n",LL.list,LL.list,LL.Maxsize);while(1){printf("请输⼊元素值,输⼊0结束插⼊操作:");fflush(stdin);/*清空标准输⼊缓冲区*/scanf("%d",&i);if(i==0)break;printf("请输⼊插⼊位置:");scanf("%d",&r);InsertList(&LL,i,r-1);printf("线性表为:");OutputList(&LL);}while(1){printf("请输⼊查找元素值,输⼊0结束查找操作:");fflush(stdin);/*清空标准输⼊缓冲区*/scanf("%d ",&i);if(i==0)break;r=FindList(&LL,i);if(r<0)printf("没有找到\n");elseprintf("有符合条件的元素,位置为:%d\n",r+1);}while(1){printf("请输⼊删除元素值,输⼊0结束查找操作:");fflush(stdin);/*清楚标准缓存区*/scanf("%d",&i);if(i==0)break;r=DeleteList1(&LL,i);if(i<0)printf("没有找到\n");else{printf("有符合条件的元素,位置为:%d\n线性表为:",r+1);OutputList(&LL);}while(1){printf("请输⼊删除元素位置,输⼊0结束查找操作:");fflush(stdin);/*清楚标准输⼊缓冲区*/scanf("%d",&r);if(r==0)break;i=DeleteList2(&LL,r-1);if(i<0)printf("位置越界\n");else{printf("线性表为:");OutputList(&LL);}}}链表基本操作l 实验⽬的2、链表(1)掌握链表的概念,学会对链表进⾏操作。
c语言单链表程序代码
c语言单链表程序代码单链表是一种常见的数据结构,它由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。
单链表的优点在于插入和删除操作的效率高,但是访问任意节点的效率较低。
下面是一个简单的单链表程序代码:```c#include <stdio.h>#include <stdlib.h>struct Node {int data;struct Node* next;};void insert(struct Node** head, int data) {struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));newNode->data = data;newNode->next = *head;*head = newNode;}void printList(struct Node* head) {while (head != NULL) {printf("%d ", head->data);head = head->next;}printf("\n");}int main() {struct Node* head = NULL;insert(&head, 1);insert(&head, 2);insert(&head, 3);printList(head);return 0;}```这个程序定义了一个结构体`Node`,包含一个整型数据`data`和一个指向下一个节点的指针`next`。
`insert`函数用于在链表头部插入一个新节点,`printList`函数用于打印整个链表。
在`main`函数中,我们创建了一个空链表`head`,然后插入了三个节点,最后打印整个链表。
这个程序虽然简单,但是涉及到了单链表的基本操作。
数据结构课程设计_职工信息管理系统_单链表实现程序源代码
数据结构课程设计_职工信息管理系统_单链表实现程序源代码(总2页)本页仅作为文档封面,使用时可以删除This document is for reference only-rar21year.March有%d条记录已经保存.)\n",count);saveflag=0;}else{system("cls");printf("保存文件失败,'0'条记录被保存!\n");}fclose(fp);} xt","ab+");elseexit(0);} ....\n");while(!feof(fp)) n",count);while(1){menu();printf("\t\t====>请选择:");scanf("%d",&choose);if(choose==0){if(saveflag==1){getchar();printf("\n=====>提示:资料已经改动,是否将改动保存到文件中(y/n)\n");scanf("%c",&ch);if(ch=='y'||ch=='Y')Save(list);} //ifprintf("\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(1)} //main()/* */。
数据结构课程设计_职工信息管理系统_单链表实现程序源代码
//要求用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是否重复。
课程信息管理系统链表保存源代码
课程信息管理系统链表保存源代码以课程信息管理系统链表保存源代码为标题,我们将介绍一个用链表来实现课程信息管理系统的源代码。
链表是一种常用的数据结构,它能够动态地存储和管理数据,非常适合用于保存课程信息。
下面我们将详细介绍链表的定义、操作和源代码实现。
一、链表的定义链表是一种由节点组成的数据结构,每个节点包含两部分:数据域和指针域。
数据域用于存储实际的数据,指针域用于指向下一个节点。
链表的头节点是链表的起点,通过头节点可以找到链表中的其他节点。
链表中的节点可以根据需要动态地插入和删除,因此链表的长度是可以变化的。
二、链表的操作链表的基本操作包括插入、删除和查找。
插入操作可以在链表的任意位置插入一个新节点,删除操作可以删除链表中的某个节点,查找操作可以根据关键字找到链表中的节点。
1. 插入操作:链表的插入操作可以分为两种情况:- 在链表的头部插入新节点:首先创建一个新节点,并将新节点的指针指向原来的头节点,然后将新节点设置为链表的新头节点。
- 在链表的中间或尾部插入新节点:首先找到插入位置的前一个节点,然后创建一个新节点,并将新节点的指针指向前一个节点的下一个节点,然后将前一个节点的指针指向新节点。
2. 删除操作:链表的删除操作可以分为两种情况:- 删除链表的头节点:首先将链表的头节点保存为临时节点,然后将链表的头节点指向下一个节点,最后释放临时节点的内存空间。
- 删除链表的中间或尾部节点:首先找到要删除节点的前一个节点,然后将前一个节点的指针指向要删除节点的下一个节点,最后释放要删除节点的内存空间。
3. 查找操作:链表的查找操作可以根据关键字来查找节点,可以根据需要实现不同的查找方式,如按照课程名称查找、按照教师名称查找等。
下面是一个用链表保存课程信息的源代码示例:```c++#include <iostream>using namespace std;// 定义课程信息节点结构体struct CourseNode {string courseName;string teacherName;CourseNode* next;};// 插入新节点void insertNode(CourseNode*& head, string courseName, string teacherName) {CourseNode* newNode = new CourseNode;newNode->courseName = courseName;newNode->teacherName = teacherName;newNode->next = head;head = newNode;}// 删除节点void deleteNode(CourseNode*& head, string courseName) { CourseNode* curNode = head;CourseNode* preNode = nullptr;while (curNode != nullptr) {if (curNode->courseName == courseName) {if (preNode == nullptr) {head = curNode->next;} else {preNode->next = curNode->next;}delete curNode;return;}preNode = curNode;curNode = curNode->next;}}// 查找节点CourseNode* searchNode(CourseNode* head, string courseName) {CourseNode* curNode = head;while (curNode != nullptr) {if (curNode->courseName == courseName) {return curNode;}curNode = curNode->next;}return nullptr;}int main() {CourseNode* head = nullptr;// 插入节点insertNode(head, "数学", "张三");insertNode(head, "英语", "李四");insertNode(head, "物理", "王五");// 删除节点deleteNode(head, "英语");// 查找节点CourseNode* node = searchNode(head, "数学");if (node != nullptr) {cout << "课程名称:" << node->courseName << endl;cout << "教师名称:" << node->teacherName << endl;} else {cout << "未找到该课程" << endl;}return 0;}```以上就是一个用链表保存课程信息的源代码示例,通过链表的插入、删除和查找操作,可以方便地管理课程信息。
- 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->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) //修改功能结束//插入记录:按工号查询到要插入的节点的位置,然后在该工号之后插入一个新节点。