📄 zgglxt.cpp
字号:
/*
程序说明:
本程序可输入员工资料,并按姓名的升序存放到磁盘文件中,
可显示指定的工资表磁盘文件的所有内容,
可查找指定姓名的查找,
可根据姓名删除记录,还可以一次性插入多个个记录。
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>
struct ChePiao /*链表结构声明*/
{
char name[20]; /*职工姓名*/
char num[20]; /*职工号码*/
char partment[40]; /*职工部门*/
char salary[10]; /*职工工资*/
char telphone[10]; /*职工电话*/
char graduate[20]; /*职工学历*/
char address[40]; /*地址*/
char zhiwu[20]; /*职务*/
char notice[200]; /*备注*/
char birth[20]; /*职工生日*/
struct ChePiao * next; /*指向下一个标签*/
};
struct ChePiao *llink; /*创建头指针*/
int i; /*存放职工人数*/
int menu() /*目录函数声明*/
{
int a;
char c[20];
printf(" ╭────────────《主菜单》───────────╮\n");
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(" ∣ ∣\n");
printf(" ╰────────────────────────────╯\n");
do
{
printf("请输入数字选择的功能:");
scanf("%d",&a);
gets(c); /*接收回车字符*/
}
while(a<0||a>7); /*超过所选择的范围*/
return a;
}
void inputs(char * prompt,char *s,unsigned count)/*判断输入字符的长度是否超过要求*/
{
char p[255];
do
{
printf(prompt);
gets(p);
if(strlen(p)>count)
printf("\t名字太长了!\n");
}while(strlen(p)>count);
strcpy(s,p);
}
/*将结点m链接到以头结点llink为最小名字的单向链表中,保持按名字的升序排列,返回头结点指针*/
struct ChePiao * putin(struct ChePiao * m,struct ChePiao * llink)
{
struct ChePiao * before ,* pt;
if(llink==NULL)
{
llink=m;
llink->next=NULL; /*next指向下一个数据*/
return llink;
}
pt=llink;
before=NULL;
while(pt)
{
if(strcmp(pt->name,m->name)<0)
{
before=pt;
pt=pt->next;
}
else
{
if(pt==llink)
{
m->next=llink;
llink=m;
return llink;
}
before->next=m;
m->next=pt;
return llink;
}
}
before->next=m;
m->next=NULL;
return llink;
}
void shuru() /*输入职工的数据函数*/
{
struct ChePiao * node; /*建立指针变量指向结构体*/
while(1)
{
node=(struct ChePiao *)malloc(sizeof(struct ChePiao)); /*为结构体开辟内存单元*/
if(!node)
{
printf(" ╭───────────────────────╮\n");
printf(" ∣ 内存已经耗尽: ∣\n");
printf(" ╰───────────────────────╯\n");
return;
}
inputs("\t请输入职工姓名(为空时结束):",node->name,19);
if(!*node->name)
{
free(node); /*释放内存空间单位*/
printf(" ╭───────────────────────╮\n");
printf(" ∣ 输入职工记录结束! ∣\n");
printf(" ╰───────────────────────╯\n");
return;
}
inputs("\t请输入职工号:",node->num,19); /*调用inputs函数进行输入*/
inputs("\t请输入职工部门:",node->partment,39);
inputs("\t请输入工资数目:",node->salary,9);
inputs("\t请输入职工电话:",node->telphone,9);
inputs("\t请输入职工学历:",node->graduate,19);
inputs("\t请输入职工出生地址:",node->address,39);
inputs("\t请输入职工的职务:",node->zhiwu,19);
inputs("\t请输入该职工备注:",node->notice,199);
inputs("\t请输入该职工的生日:",node->birth,19);
llink=putin(node,llink);
}
}
void save() /*将链表数据保存到指定磁盘文件*/
{
struct ChePiao *node;
FILE *fp; /*建立指针指向FILE*/
char filename[40];
if(llink)
{
inputs("\t请输入你要保存的职工文件名:",filename,39);
if(!(fp=fopen(filename,"wb"))) /*文件打开的方式*/
{
printf("\t保存文件失败!\n");
exit(0);
}
printf("\t正在保存文件...\n");
node=llink;
while(node)
{
fwrite(node,sizeof(struct ChePiao),1,fp); /*文件的读的方式,字节数为1*/
node=node->next; /*指向下一个指针*/
}
printf("\t已成功保存了文件!\n");
fclose(fp); /*关闭文件*/
}
else
printf("\t目前没有你要的工资记录!\n\n");
}
void print(struct ChePiao * node) /*输出函数,显示数据结果*/
{
printf(" ╭────────────────────╮\n");
printf(" ∣%d:职工号:%10s\n",++i,node->num); /*有变量i自增,保存职工的数量*/
printf(" ∣姓名:%s\n",node->name);
printf(" ∣部门:%s\n",node->partment);
printf(" ∣工资:%s\n",node->salary);
printf(" ∣电话:%s\n",node->telphone);
printf(" ∣职工学历:%s\n",node->graduate);
printf(" ∣职工出生地址:%s\n",node->address);
printf(" ∣职工的职务:%s\n",node->zhiwu);
printf(" ∣职工的备注:%s\n",node->notice);
printf(" ∣职工的生日:%s \n",node->birth);
printf(" ╰────────────────────╯\n");
printf("\n\n");
}
void load(char * filename) /*将指定磁盘文件调入内存*/
{
struct ChePiao *node,*before=NULL; /*对指针before进行初始化为空*/
FILE *fp;
/*先清除已有链表*/
while(llink)
{
node=llink;
llink=llink->next;
free(node);
}
if(!(fp=fopen(filename,"rb")))
{
printf("\t打开文件失败,可能是因为你指定的磁盘文件不存在!\n");
return;
}
printf("\t载入文件...\n");
node=(struct ChePiao *)malloc(sizeof(struct ChePiao)); /*开辟内存空间*/
if(!node)
{
printf("\t内存已用完!\n");
return;
}
llink=node;
while(!feof(fp))
{
if(fread(node,sizeof(struct ChePiao),1,fp)!=1)
break;
node->next=(struct ChePiao *)malloc(sizeof(struct ChePiao));
if(!node->next)
{
printf("\t内存耗尽!\n");
return;
}
before=node;
node=node->next;
}
before->next=NULL;
free(node);
printf("\t成功载入!\n\n");
fclose(fp);
}
void list()
{
struct ChePiao * node;
char filename[40];
inputs("\t请输入你要显示职工的名字:",filename,39);
load(filename);
i=0;
node=llink;
while(node)
{
print(node);
node=node->next;
}
printf("\n\n\n");
}
struct ChePiao * found()
{
struct ChePiao * node;
char filename[40];
char name[20];
inputs("\t请输入待查询的工资文件的名字:",filename,39);
/*先清除已有链表*/
while(llink)
{
node=llink;
llink=llink->next;
free(node);
}
load(filename);
node=llink;
inputs("\t请输入你想要找的姓名:",name,19);
while(node)
{
if(!strcmp(name,node->name)) /*调用库函数*/
return node;
node=node->next;
}
return NULL;
}
void result() /*查询结果的显示函数*/
{
struct ChePiao * node;
if(node=found()) /*调用函数found*/
{
printf("╭────────────────────╮\n");
printf("∣查询结果为:\n");
printf("∣ 姓名:%s\n",node->name);
printf("∣ 部门:%s\n",node->partment);
printf("∣ 工资:%s\n",node->salary);
printf("∣ 职工号码:%s\n",node->num);
printf("∣ 电话:%s\n",node->telphone);
printf("∣ 职工学历:%s\n",node->graduate);
printf("∣ 职工出生地址:%s\n",node->address);
printf("∣ 职工的职务:%s\n",node->zhiwu);
printf("∣ 职工的备注:%s\n",node->notice);
printf("∣ 职工的生日:%s\n",node->birth);
printf("╰────────────────────╯\n");
}
else
printf("\t没有找到这个姓名!\n\n");
}
struct ChePiao * tell(char * name)
{
struct ChePiao * node;
node=llink;
while(node)
{
if(!strcmp(name,node->name))
return node;
node=node->next;
}
return NULL;
}
void restore(char * filename) /*将链表数据重新保存为原文件*/
{
struct ChePiao *node;
FILE *fp;
if(!(fp=fopen(filename,"wb")))
{
printf("\t恢复文件失败!\n");
return;
}
if(llink)
{
printf("\t正在重新保存为原文件...\n");
node=llink;
while(node)
{
if(fwrite(node,sizeof(struct ChePiao),1,fp)!=1)
return;
node=node->next;
}
printf("\t成功保存为原文件!\n");
fclose(fp);
}
else
printf("\t没有职工记录用来保存!\n\n");
}
void delet() /*删除函数*/
{
struct ChePiao * node,*before=NULL,*pt;
char name[20],filename[40];
inputs("\t请输入待删除一个职工的工资文件名:",filename,39);
load(filename); /*调用载入函数*/
if(!llink)
return;
inputs("\t请输入要删除的职工姓名:",name,19);
node=tell(name);
if(node)
{
pt=llink;
while(pt!=node)
{
before=pt;
pt=pt->next;
}
if(pt==llink)
llink=llink->next;
else
before->next=pt->next;
free(node); /*释放内存单元*/
restore(filename); /*重新保存文件*/
printf("\t已成功删除名字为“%s”的工资记录!\n",name);
}
else
printf("\t没有该职工的记录!\n");
}
void insert() /*插入函数*/
{
char filename[40];
inputs("\t请输入你要添加记录的文件名字:",filename,39);
load(filename);
if(!llink)
return;
shuru();
restore(filename);
}
void main() /*主函数*/
{
llink=NULL; /*初始化 使头指针为空*/
struct ChePiao * t=NULL;
while(1)
{
switch(menu()) /*采用SWICH语句调用各个函数达到简单的使用*/
{
case 1:shuru();break;
case 2:save();break;
case 3:list();break;
case 4:result();break;
case 5:delet();break;
case 6:insert();break;
case 7:
while(llink)
{
t=llink;
llink=llink->next;
free(t);
}
printf("\t谢谢使用!\n");
exit(0);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -