C语言 TC 职工工资管理系统 数据结构课程设计 带头结点单循环链表
C语言 TC 职工工资管理系统 数据结构课程设计 带头结点单循环链表
来博客员的第一篇,过往没什么总结,把上学时的课程设计源码放上来,纪念
#include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct node /*结构类型定义*/ { int num; /*编号*/ char nam[20];/*姓名*/ char sex[4];/*性别*/ int bam;/*基础工资*/ int dem;/*扣除工资*/ int inm;/*补贴工资*/ int mon;/*实际工资*/ struct node *next;
}*Link,LNode;
Link inilink(Link head) { head=(Link)malloc(sizeof(struct node)); head->next=NULL; return(head); } void mimaqueren(); void meau(); void xinmima(); void setlink(Link head); void printlink(Link head); void search(Link head); void numbersearch(Link head); void namesearch(Link head); void insert(Link head); void loadlink(Link head); void savelink(Link head); void paixuxuanze(Link head); void paixu1(Link head); void paixu2(Link head); void paixu3(Link head); void paixu4(Link head); void paixu5(Link head); void tongjixuanze(Link head); void tongji1(Link head); void tongji2(Link head); void tongji3(Link head); void tongji4(Link head); void bianhaoqueren(Link head,Link q); void charu(Link head,Link p); void charu1(Link head); void charu2(Link head); void delnumber(Link head); void delname(Link head);
/*密码修改*/ /*没有密码文件或为空时直接进入,有密码确定密码,没密码时修改密码为建立新密码 不过这样每次一个函数完后要有个meau()*/ void mimaqueren(Link head) { static int i=1; FILE *fp; char mima[16],shuru[16]; if((fp=fopen("mima.txt","rb"))==NULL) meau(head); else fgets(mima,16,fp); printf("请输入密码"); gets(shuru); while(strcmp(mima,shuru)!=0&&i<4) { i++; printf("密码错误,请重新输入:"); mimaqueren(head); } if(strcmp(mima,shuru)==0)
meau(head); else exit(0);
fclose(fp); }
void mimaxiugai() /*修改密码*/ { char a[10],b[10]; int t=0; FILE *fp; fp=fopen("mima.txt","rb"); if(fp==NULL) { printf("程序未设密码,请设定\n"); xinmima(fp); } getchar(); fgets(a,10,fp); printf("请输入旧密码:"); gets(b); while(strcmp(a,b)!=0&&t<2) { printf("输入密码错误!!!\n请重新输入:\n"); t++; gets(b); }
if(t<2) xinmima(fp); } void xinmima(FILE *fp) {
char a[10],b[10]; int j=0,k; printf("请输入新密码:"); scanf("%s",&a); printf("请再次输入确认密码:"); scanf("%s",&b); while(strcmp(a,b)!=0) { printf("两次输入不同!\n"); printf("请重新输入:"); xinmima(fp); } printf("密码修改成功!\n"); fp=fopen("mima.txt","w"); k=strlen(a); for(j=0;j<k;j++) putc(a[j],fp); fclose(fp); meau(); } /*数据录入*/ /*这个倒好做,把单链表录入改一下就行,难在不能有同号的,这费了不少时间 用了不少方法,判断简单,就是反回不行,递归不行,测反回也不行,函数 也不行,最后把输入编号放入循环里,有同号继续循环,无同号退出*/ void setlink(Link head) { /*建立单链表*/ Link p,q,r; int i=0;int c; int a=1; int b; printf("\n"); p=head; r=head->next; while(a==1) { q=(LNode *)malloc(sizeof(struct node)); b=1; while(b==1)/*编码确认部分*/ { printf("输入编号:\n"); scanf("%d",&q->num); r=head->next; while(r!=NULL&&r!=head&&r->num!=q->num) {
r=r->next; } if(r==NULL||r==head) b=0; else {printf("你输入的员工已录入,请重新输入。\n"); b=1; }
} printf("输入姓名:\n");scanf("%s",&q->nam); printf("输入性别:");scanf("%s",&q->sex); printf("输入基本工资:\n");scanf("%d",&q->bam); printf("输入补贴工资:\n"); scanf("%d",&q->inm); printf("输入扣除工资:\n");scanf("%d",&q->dem); q->mon=q->bam+q->inm-q->dem; p->next=q;p=q; i++; printf("是否输入另一个数据?\n输入1继续录入,其他键退出"); scanf("%d",&c); getchar(); if(c==1) { q->next=head;
continue; } else { q->next=head; break; } } printlink(head); getchar(); meau(head); }
void printlink(Link head) { /*输出线性单链表*/ Link p; p=head->next; printf("编号 姓名 性别 基础工资 扣除工资 补贴工资 实际工资\n"); while(p!=head) { printf("%2d%10s%6s%11d%12d%12d%12d\n",p->num,p->nam,p->sex,p->bam,p->dem,p->inm,p->mon); p=p->next; } } /*数据查找*/ /*选择查找方式*/ void search(Link head) {int choose=0; printf("1按编号\n"); printf("2按姓名\n"); printf("3返回上级目录\n"); printf("请输入查询方式:\n"); scanf("%d",&choose); switch(choose) { case 1:numbersearch(head);break; case 2:namesearch(head);break; case 3:meau(head);break; } } /*编号直接比较,有相同则输出结点,没有反回*/ void numbersearch(Link head) { int y; Link p; p=head->next; printf("请输入所要查询的编号:\n"); scanf("%d",&y); while(p!=head&&p->num!=y) {
p=p->next; } if(p==head) printf("没有该学生数据。"); else printf("编号 姓名 性别 基础工资 扣除工资 补贴工资 实际工资\n"); printf("%2d%10s%6s%11d%12d%12d%12d\n",p->num,p->nam,p->sex,p->bam,p->dem,p->inm,p->mon); getchar(); meau(head); } /*姓名支持模糊查询*/ /* strlen测输入名字长度,strncopy分别复制输入字符串的前几位,进行比较,出过小问题 因为char后几位字符不定,所以一直是无数据,对c b 字符串初始为空解决*/
void namesearch(Link head) { char y[20]; char c[20]=""; char b[20]=""; Link p; int t; int a=1; p=head->next; printf("请输入所要查询的姓名:\n"); scanf("%s",&y); t=strlen(y); strncpy(c,y,t); while(p!=head) { strncpy(b,p->nam,t); if(strcmp(c,b)==0) { if(a==1) {printf("编号 姓名 性别 基础工资 扣除工资 补贴工资 实际工资\n"); a=0; } printf("%2d%10s%6s%11d%12d%12d%12d\n",p->num,p->nam,p->sex,p->bam,p->dem,p->inm,p->mon);
} p=p->next;
} if(a==1) printf("没有该学生数据。");
getchar(); meau(head); }
/*数据插入*/ void insert(Link head) { int choose=0; printf("1想要插入到第几行\n"); printf("2在编号为几的数据后插入数据\n"); printf("3返回上级目录\n"); printf("请输入查询方式:\n"); scanf("%d",&choose); switch(choose) { case 1:charu1(head);break; case 2:charu2(head);break; case 3:meau(head);break; } } void charu1(Link head) {int t; int i=0; Link p; p=head; printf("请输入想要插入的行:"); scanf("%d",&t); for(i=0;i<t;i++) {/*找p*/ p=p->next; } charu(head,p); }
/*在某编号后插入,这个用了查找里的一部分*/ void charu2(Link head) { int y; Link p; p=head->next; printf("你要在编号为几的数据后插入\n"); scanf("%d",&y); while(p!=head&&p->num!=y) {
p=p->next; } if(p==head) {printf("输入错误,没有该点。\n"); } else charu(head,p);
getchar(); meau(head); }
void charu(Link head,Link p) {Link q,r; int b=1; int k; int c; int m; r=head->next; q=(Link)malloc(sizeof(struct node)); while(b==1)/*编码确认部分,和录入一样*/ { printf("输入编号:\n"); scanf("%d",&q->num); r=head->next; while(r!=NULL&&r!=head&&r->num!=q->num) {
r=r->next; } if(r==NULL||r==head) b=0; else {printf("你输入的员工已录入,请重新输入。\n"); b=1; }
} printf("输入姓名:\n");scanf("%s",&q->nam); printf("输入性别:");scanf("%s",&q->sex); printf("输入基本工资:\n");scanf("%d",&q->bam); printf("输入补贴工资:\n"); scanf("%d",&q->inm); printf("输入扣除工资:\n");scanf("%d",&q->dem); k=q->bam+q->inm-q->dem; q->mon=k; q->next=p->next; p->next=q; printf("是否输入另一个数据?\n输入1继续录入,其他键退出\n"); scanf("%d",&c); getchar(); if(c==1) { p=q; charu(head,p);/*递归*/ } else { printf("是否输出数据,输入1输出,其他键退出"); scanf("%d",&m); if(m==1) { printlink(head); } getchar(); insert(head);/*到插入选择界面*/ }
} /*数据删除*/ /*查找删除,记录前结点,然后删除*/ /*选择删除方式*/ void del(Link head) {int choose=0; printf("1按编号\n"); printf("2按姓名\n"); printf("3返回上级目录\n"); printf("请输入查询方式:\n"); scanf("%d",&choose); switch(choose) { case 1:delnumber(head);break; case 2:delname(head);break; case 3:meau(head);break; } } void delnumber(Link head) { int t,m; Link p,q; p=head; q=p->next; printf("输入所要删除员工的编号:"); scanf("%d",&t); while(q!=head) { if(q->num==t) { p->next=q->next;
free(q); printf("成员已删除\n"); printf("是否输出数据,输入1输出,其他键退出"); scanf("%d",&m); if(m==1) {printlink(head); } getchar(); meau(head); } p=q; q=q->next; } if(q==NULL) printf("没有数据"); if(q==head) printf("你想删除的数据不存在"); meau(head); } void delname(Link head) { char y[20]; char c[20]=""; char b[20]=""; Link p,q; int t,k; int m=0; q=head; p=q->next; printf("请输入所要删除员工的姓名:\n"); scanf("%s",&y); t=strlen(y); strncpy(c,y,t); while(p!=head) { strncpy(b,p->nam,t); if(strcmp(c,b)==0) { m=1; q->next=p->next; free(p); p=q->next; } q=p; p=p->next;
} if(m==1) { printf("成员已删除\n"); printf("是否输出数据,输入1输出,其他键退出"); scanf("%d",&k); if(k==1) { printlink(head); } getchar(); meau(head); } else printf("数据不存在\n");
getchar(); meau(head);
} /*数据读入*/ /*数据读入和存储,本想按最新要求能输入文件路径和文件名,可用字符串来做 失败了,暂时放弃*/ void loadlink(Link head) { FILE *fp; int m; Link p,q; fp=fopen("dangan.txt","rb"); p=(Link)malloc(sizeof(struct node)); p=head->next; if((fp)==NULL) { printf("不能打开文件\n"); getchar(); meau(head); } while(!feof(fp)) { if(fread(p,sizeof(struct node),1,fp)!=1) {
break; } p->next=(Link)malloc(sizeof(struct node)); q=p; p=p->next; } q->next=head; free(p); fclose(fp); printf("数据已读入\n"); printf("是否输出数据,输入1输出,其他键退出"); scanf("%d",&m); if(m==1) {printlink(head); } getchar(); meau(head);
} /*数据保存*/ /*给了现成的,改改就能用,当然也看懂了*/ void savelink(Link head)
{ FILE *fp; Link p; p=head->next; fp=fopen("dangan.txt","wb"); while(p!=head) { fwrite(p,sizeof(struct node),1,fp); p=p->next; } printf("数据已保存\n"); fclose(fp); getchar(); meau(head); }
/*数据统记*/ /*这个最简单,取点累加就行, 就是函数太多,想办法不写这么多函数,不过试了几次不行,先过了再说*/ void tongjixuanze(Link head) {int choose=0; printf("请选择统记方式\n1按基础工资\n2按补贴工资\n3按扣除工次\n4按总工资"); scanf("%d",&choose); switch(choose) { case 1:tongji1(head);break; case 2:tongji2(head);break; case 3:tongji3(head);break; case 4:tongji4(head);break; } } void tongji1(Link head) { Link p; int t,k; int i=1; p=head->next; t=p->bam; for(;p!=head;p=p->next) {t=t+p->bam;
i++; } k=t/i; printf(" 总基础工资:"); printf("%d\n",t); printf(" 平均基础工资:"); printf("%d\n",k); getchar(); meau(head);
} void tongji2(Link head) { Link p; int t,k; int i=1; p=head->next; t=p->inm; for(;p!=head;p=p->next) { t=t+p->inm;
i++; } k=t/i; printf("总补贴工资:"); printf(" %d\n",t); printf("平均补贴工资:"); printf(" %d\n",k); getchar(); meau(head);
} void tongji3(Link head) { Link p; int t,k; int i=1; p=head->next; t=p->dem; for(;p!=head;p=p->next) { t=t+p->dem;
i++; } k=t/i; printf("总扣除工资:"); printf(" %d",t); printf("平均扣除工资:"); printf(" %d\n",k); getchar(); meau(head); } void tongji4(Link head) { Link p; int t,k; int i=1; p=head->next; t=p->mon; for(;p!=head;p=p->next) { t=t+p->mon;
i++; } k=t/i; printf("总工资:"); printf(" %d\n",t); printf("平均总工资:"); printf(" %d\n",k); getchar(); meau(head); }
/*数据排序*/ /*这个麻烦了,原先想用指针做,总出问题,就用值做了, 冒泡法。 函数太多。想写一个解决,可每个比的项都不一样*/ void paixuxuanze(Link head) {int choose=0; printf("请选择排序方式\n1按编号\n2按基础工资\n3按补贴工资\n4按扣除工次\n5按总工资"); scanf("%d",&choose); switch(choose) { case 1:paixu1(head);break; case 2:paixu2(head);break; case 3:paixu3(head);break; case 4:paixu4(head);break; case 5:paixu5(head);break; } }
void paixu1(Link head) { Link q,p,t; int m; q=head->next; p=q->next; t=(Link)malloc(sizeof(struct node)); while(q->next!=head) { while(p!=head) { if(q->num>p->num) { t->num=p->num; strcpy(t->nam,p->nam); strcpy(t->sex,p->sex); t->bam=p->bam; t->inm=p->inm;t->dem=p->dem;t->mon=p->mon;
p->num=q->num; strcpy(p->nam,q->nam); strcpy(q->sex,q->sex); p->bam=q->bam; p->inm=q->inm;p->dem=q->dem;p->mon=q->mon;
q->num=t->num; strcpy(q->nam,t->nam); strcpy(q->sex,t->sex); q->bam=t->bam; q->inm=t->inm;q->dem=t->dem;q->mon=t->mon; } p=p->next; } q=q->next; p=q->next; } printf("排序成功!!!\n"); printf("是否输出数据,输入1输出,其他键退出"); scanf("%d",&m); if(m==1) {printlink(head); } getchar(); meau(head); } void paixu2(Link head) { Link q,p,t; int m; q=head->next; p=q->next; t=(Link)malloc(sizeof(struct node)); while(q->next!=head) { while(p!=head) { if(q->bam>p->bam) { t->num=p->num; strcpy(t->nam,p->nam); strcpy(t->sex,p->sex); t->bam=p->bam; t->inm=p->inm;t->dem=p->dem;t->mon=p->mon;
p->num=q->num; strcpy(p->nam,q->nam); strcpy(q->sex,q->sex); p->bam=q->bam; p->inm=q->inm;p->dem=q->dem;p->mon=q->mon;
q->num=t->num; strcpy(q->nam,t->nam); strcpy(q->sex,t->sex); q->bam=t->bam; q->inm=t->inm;q->dem=t->dem;q->mon=t->mon; } p=p->next; } q=q->next; p=q->next; } printf("排序成功!!!\n"); printf("是否输出数据,输入1输出,其他键退出"); scanf("%d",&m); if(m==1) {printlink(head); } getchar(); meau(head); } void paixu3(Link head) { Link q,p,t; int m; q=head->next; p=q->next; t=(Link)malloc(sizeof(struct node)); while(q->next!=head) { while(p!=head) { if(q->inm>p->inm) { t->num=p->num; strcpy(t->nam,p->nam); strcpy(t->sex,p->sex); t->bam=p->bam; t->inm=p->inm;t->dem=p->dem;t->mon=p->mon;
p->num=q->num; strcpy(p->nam,q->nam); strcpy(q->sex,q->sex); p->bam=q->bam; p->inm=q->inm;p->dem=q->dem;p->mon=q->mon;
q->num=t->num; strcpy(q->nam,t->nam); strcpy(q->sex,t->sex); q->bam=t->bam; q->inm=t->inm;q->dem=t->dem;q->mon=t->mon; } p=p->next; } q=q->next; p=q->next; } printf("排序成功!!!\n"); printf("是否输出数据,输入1输出,其他键退出"); scanf("%d",&m); if(m==1) {printlink(head); } getchar(); meau(head); } void paixu4(Link head) { Link q,p,t; int m; q=head->next; p=q->next; t=(Link)malloc(sizeof(struct node)); while(q->next!=head) { while(p!=head) { if(q->dem>p->dem) { t->num=p->num; strcpy(t->nam,p->nam); strcpy(t->sex,p->sex); t->bam=p->bam; t->inm=p->inm;t->dem=p->dem;t->mon=p->mon;
p->num=q->num; strcpy(p->nam,q->nam); strcpy(q->sex,q->sex); p->bam=q->bam; p->inm=q->inm;p->dem=q->dem;p->mon=q->mon;
q->num=t->num; strcpy(q->nam,t->nam); strcpy(q->sex,t->sex); q->bam=t->bam; q->inm=t->inm;q->dem=t->dem;q->mon=t->mon; } p=p->next; } q=q->next; p=q->next; } printf("排序成功!!!\n"); printf("是否输出数据,输入1输出,其他键退出"); scanf("%d",&m); if(m==1) {printlink(head); } getchar(); meau(head); } void paixu5(Link head) { Link q,p,t; int m; q=head->next; p=q->next; t=(Link)malloc(sizeof(struct node)); while(q->next!=head) { while(p!=head) { if(q->mon>p->mon) { t->num=p->num; strcpy(t->nam,p->nam); strcpy(t->sex,p->sex); t->bam=p->bam; t->inm=p->inm;t->dem=p->dem;t->mon=p->mon;
p->num=q->num; strcpy(p->nam,q->nam); strcpy(q->sex,q->sex); p->bam=q->bam; p->inm=q->inm;p->dem=q->dem;p->mon=q->mon;
q->num=t->num; strcpy(q->nam,t->nam); strcpy(q->sex,t->sex); q->bam=t->bam; q->inm=t->inm;q->dem=t->dem;q->mon=t->mon; } p=p->next; } q=q->next; p=q->next; } printf("排序成功!!!\n"); printf("是否输出数据,输入1输出,其他键退出"); scanf("%d",&m); if(m==1) {printlink(head); } getchar(); meau(head); }
/*主目录*/ void meau(Link head) { int choose=20; printf("*******************************************************\n"); printf("* 职工工资管理系统 * 数据结构课程设计 *\n"); printf("* 1密码修改 * 环境 *\n"); printf("* 2数据录入 * 带头结点的单循环链表 *\n"); printf("* 3数据查找 * 计算机系 *\n"); printf("* 4数据插入 * *\n"); printf("* 5数据读入 * 信息管理专业 *\n"); printf("* 6数据保存 * *\n"); printf("* 7数据统记 * 班级: *\n"); printf("* 8数据删除 * *\n"); printf("* 9数据排序 * 作者: *\n"); printf("* 0退出系统 * *\n"); printf("* 请输入数字选择服务: * 学号: *\n"); printf("*******************************************************\n"); scanf("%d",&choose); if(choose<0||choose>9) printf("选择错误\n请输入数字选择服务:\n"); switch(choose) { case 1:mimaxiugai();break; case 2:setlink(head);break; case 3:search(head);break; case 4:insert(head);break; case 5:loadlink(head);break; case 6:savelink(head);break; case 7:tongjixuanze(head);break; case 8:del(head);break; case 9:paixuxuanze(head);break; case 0:exit(0);break; } } void main() {Link head; head=inilink(head); mimaqueren(head); } /*做完了,最弱智的错是head就没传到功能函数里,一执行某些函数总是内存出错,系统还不告错在哪,从头查几次才找出毛病. 好的习惯很重要,最后说句 其实一个人做反倒比两人快。两人沟通就是个问题,不过也因为一个人做,这方面没学到什么*/