#include
#include
#include
#include
struct employee
{
char no[40]; //职工号
char name[40]; //职工姓名
char sex[10]; //职工性别
int age; //职工年龄
struct employee *next;//下一结点指针
};
typedef struct employee EMP;
EMP *h;
void load(); //读文件数据,并创建链表
void save(); //将链表中数据写到文件中
void add(EMP *p); //链表中增加职工结点
void del(char *s); //链表中删除指定姓名的职工结点
void update(); //链表中更新职工结点中的数据
void browse(); //在屏幕上显示链表中所有结点数据
void menu(); //显示系统主菜单
void delEmp(); //删除职工
void addEmp(); //增加职工
void main(void)
{
int op;//operation
h =(EMP *)malloc(sizeof(EMP)); //创建链表的头结点
h->next = NULL; //初始化链表头节点中下一节点指针为NULL
menu();
scanf("%d",&op);
while(op!=0)
{
switch(op)
{
case 1:
load();
break;
case 2:
save();
break;
case 3:
addEmp();
break;
case 4:
delEmp();
break;
case 5:
update();
break;
case 6:
browse();
break;
}
menu();
scanf("%d",&op);
}
}
//显示系统主菜单函数
void menu()
{
printf(" Main Menu\n");
printf(" **********https://www.2345.com/?kcys123************ \n");
printf(" * 0:quit 1 :load * \n");
printf(" * 2:save 3 :add * \n");
printf(" * 4:delete 5 :update * \n");
printf(" * 6:browse 7 :default* \n");
printf(" ********https://www.2345.com/?kcys123************** \n");
}
//读文件数据,并创建链表函数
void load()
{
FILE *fp;
char ch;
fp = fopen("data.txt","r");
if(fp==NULL)
{
printf("打开文件错误,按任意返回主菜单\n");
getch();//程序停下来,等待输入
return;
}
while(!feof(fp))
{
EMP *node =(EMP *)malloc(sizeof(EMP));
node->next = NULL;
fscanf(fp,"%s%s%s%d",node->no,node->name,node->sex,&node->age);//从文件中读一行职工信息
add(node); // 调用函数增加链表结点
}
fclose(fp);
}
//链表中增加职工结点的函数
void add(EMP *p)
{
EMP *q;
q = h->next; //将q指针指向链表中第一个职工结点
if(q==NULL) //如果q指针为NULL,则表示当前链表为空
{
h->next = p; //p指针指向的结点为链表中第一个结点
p->next = NULL;
}
else
{
while(q->next!=NULL) //通过while循环找到链表中最后一个结点
{
q = q ->next;
}
q->next = p; //将q指针指向的最后一个结点的next指针指向新增结点
p->next =NULL; //现在p指针指向的是最后一个结点,因此将该节点的next指针设为NULL
}
}
//增加职工函数
void addEmp()
{
EMP *node;
node = (EMP *)malloc(sizeof(EMP));
node->next = NULL;
printf("input the employee's no name sex age:\n");
scanf("%s%s%s%d",node->no,node->name,node->sex,&node->age);
add(node);
}
//删除职工函数
void delEmp()
{
char name[40];
printf("input del name:\n");
scanf("%s",name);
del(name);
}
//在屏幕上显示链表中所有职工结点数据函数
void browse()
{
EMP *node;
node = h->next; //node指针指向链表第一个结点
printf("Employee no name age sex\n");
while(node) //遍历链表
{
printf("%12s%6s%5d%4s\n",node->no,node->name,node->age,node->sex);
node = node->next; //node指针指向下一个职工结点
}
printf("\n");
}
//将链表中数据写到文件中的函数
void save()
{
FILE *fp;
EMP *node;
fp = fopen("data.txt","w"); //以写的方式打开文件
node = h->next; //node指针指向链表第一个结点
while(node!=NULL)
{ //"%s %s %s %d\n" 格式符之间有空格
fprintf(fp,"%s %s %s %d\n",node->no,node->name,node->sex,node->age);
node = node ->next;
}
fclose(fp);
}
//删除职工结点的函数
void del(char *s)
{
EMP *p,*q;
p = h->next;//链表中第一个节点 p->next=p->next->next;
q = p->next;//链表中第二个节点
if(strcmp(s,p->name)==0)
{h->next=p->next;
free(p);
return;
}
while(q!=NULL)
{
if(strcmp(s,q->name)==0)
{
p->next = q->next;
free(q);
break;
}
p = q;
q = q->next;
}
}
//更新职工结点的函数
void update()
{
char name[40];
int flag = 0;
EMP *p;
printf("input the name:\n");
scanf("%s",name);
p = h->next;
while(p!=NULL)
{
if(strcmp(name,p->name)==0)
{
printf("input the age:\n");
scanf("%d",&p->age);
printf("input the sex:\n");
getchar();
scanf("%c",&p->sex);
flag = 1;
break;
}
p=p->next;
}
if(flag==0)
{
printf("error username\n");
}
}
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
网页名称:C语言员工管理系统-创新互联
浏览路径:http://scgulin.cn/article/iejjs.html