代码:
#include
#include
#include
struct workers
{
char jobNo[15]; //职工号
char name[15]; //姓名
char sex[15]; //性别
char birthday[15]; //出生年月
char degree[15]; //学历
char position[15]; //职务
char salary[15]; //工资
char addr[15]; //住址
char tel[15]; //电话
};
//类型定义语句
typedef struct node
{
struct workers data;
struct node *next;
}Node;
//添加信息函数 "尾插法建表"
void Add(Node *worker)
{
Node *p, *q;
char n[10];
q = worker;
while (q->next != NULL)
{
q = q->next;
}
while (1)
{
printf("提示:输入0返回主菜单!\n");
printf("请输入职工号:");
scanf("%s", n);
if (strcmp(n, "0") == 0)
{
break;
}
p = (Node *)malloc(sizeof(Node));
strcpy(p->data.jobNo, n);
printf("请输入姓名:");
scanf("%s", p->data.name);
printf("请输入性别:");
scanf("%s", p->data.sex);
printf("请输入出生年月:");
scanf("%s", p->data.birthday);
printf("请输入学历:");
scanf("%s", p->data.degree);
printf("请输入职务:");
scanf("%s", p->data.position);
printf("请输入工资:");
scanf("%s", p->data.salary);
printf("请输入住址:");
scanf("%s", p->data.addr);
printf("请输入电话:");
scanf("%s", p->data.tel);
printf("提示:已经完成一条记录的添加!");
p->next = NULL;
q->next = p;
q = p;
}
}
//修改职工信息函数
int change(Node *worker)
{
Node *p;
char find[20];
p = worker->next;
if (p == NULL)
{
printf("\n提示:没有资料可以修改!\n");
return 0;
}
printf("请输入要修改的职工号");
scanf("%s", find);
while (p != NULL)
{
if (strcmp(p->data.jobNo, find) == 0)
{
break;
}
p = p->next;
}
if (p!=NULL)
{
int x;
while (1)
{
printf("完成修改请输入0,否则输入非0数字进行修改!");
scanf("%d", &x);
if (x == 0)
{
break;
}
printf(" 请输入新职工号: ");
scanf("%s", p->data.jobNo);
printf(" 请输入新职工姓名: ");
scanf("%s", p->data.name);
printf(" 请输入新职工性别: ");
scanf("%s", p->data.sex);
printf(" 请输入新职工出生年月: ");
scanf("%s", p->data.birthday);
printf(" 请输入新职工学历: ");
scanf("%s", p->data.degree);
printf(" 请输入新职工职务: ");
scanf("%s", p->data.position);
printf(" 请输入新职工工资: ");
scanf("%s", p->data.salary);
printf(" 请输入新职工住址: ");
scanf("%s", p->data.addr);
printf(" 请输入新职工电话: ");
scanf("%s", p->data.tel);
printf(" \n提示:该职工资料已经修改!\n ");
}
}
else
printf("\n提示:没有你要修改的资料!\n ");
}
//输出职工信息函数
int Disp(Node *worker)
{
Node *p;
p = worker->next;
if (p == NULL)
{
printf(" \n提示:没有信息可以显示!\n ");
return 0;
}
printf("\t\t\t\t显示结果\n");
printf(" \n职工号 姓名 性别 出生年月 学历 职务 工资 住址 电话 \n ");
while (p!=NULL)
{
printf("\n %s\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t\n ", p->data.jobNo, p->data.name,
p->data.sex, p->data.birthday, p->data.degree, p->data.position,
p->data.salary, p->data.addr, p->data.tel);
p = p->next;
}
}
//查询职工信息函数: 按职工号查询 按职工姓名查询
int Cha_xun(Node *worker)
{
Node *p;
int sel;
char find[20];
p = worker->next;
if (p==NULL)
{
printf(" \n提示:没有资料可以查询!\n ");
return 0;
}
printf("\n提示:\n 输入 0---- 退出\t 输入 1----按职工号查询\t 输入 2-----按职工姓名查询\n");
printf("请选择:");
scanf("%d", &sel);
if (sel == 1)
{
printf("\n请输入你要查询分类的职工号:");
scanf("%s", find);
while (p!=NULL)
{
if (strcmp(p->data.jobNo, find) == 0)
{
printf(" 职工号 姓名 性别 出生年月 学历 职务 工资 住址 电话 \n ");
printf(" \n %s\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t\n ", p->data.jobNo, p->data.name,
p->data.sex, p->data.birthday, p->data.degree, p->data.position,
p->data.salary, p->data.addr, p->data.tel);
}
p = p->next;
}
}
else if (sel == 2)
{
printf(" \n输入你要查询分类的职工姓名:");
scanf("%s", find);
while (p!=NULL)
{
if (strcmp(p->data.name, find) == 0)
{
printf(" 职工号 姓名 性别 出生年月 学历 职务 工资 住址 电话 \n ");
printf(" \n %s\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t \n ", p->data.jobNo, p->data.name,
p->data.sex, p->data.birthday, p->data.degree, p->data.position,
p->data.salary, p->data.addr, p->data.tel);
}
p = p->next;
}
}
else if (sel == 0)
return 0;
}
//删除职工信息函数
int Delete(Node *worker)
{
Node *p, *r;
char find[10];
p = worker->next;
if (p == NULL)
{
printf("提示:没有职工信息可以删除!\n ");
return 0;
}
printf(" \n提示:请输入你要删除的职工号!\n ");
scanf("%s", find);
while (p != NULL)
{
if (strcmp(p->data.jobNo, find) == 0)
{
break;
}
p = p->next;
}
if (p!=NULL)
{
r = worker;
while (r->next != p)
{
r = r->next;
}
r->next = r->next->next;
}
}
//将职工信息保存到文件中
void save(Node *worker)
{
int n;
Node *p = NULL;
FILE *fp;
printf("是否保存到文件?( 1-----保存!,0-----不保存! )");
scanf("%d", &n);
if (n == 1)
{
if (worker->next == NULL)
{
printf(" 没有记录!");
}
else
{
p = worker->next;
}
if ((fp = fopen(" 职工信息管理系统.txt ", " wb ")) == NULL)
{
printf(" 文件不能打开!\n");
}
while (p != NULL)
{
fprintf(fp, " %s\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t ", p->data.jobNo, p->data.name, p->data.sex,
p->data.birthday, p->data.degree, p->data.position, p->data.salary,
p->data.addr, p->data.tel);
p = p->next;
}
fclose(fp);
}
}
//读取职工信息
void Du_qu(Node *worker)
{
Node *p;
FILE *fp;
if ((fp = fopen("职工信息管理系统.txt", "rb")) == NULL)
{
printf("文件不能打开!\n ");
}
p = worker->next;
while (p!=NULL)
{
fscanf(fp, " %s\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t ", p->data.jobNo, p->data.name, p->data.sex,
p->data.birthday, p->data.degree, p->data.position, p->data.salary,
p->data.addr, p->data.tel);
p=p->next;
}
fclose(fp);
}
//主函数实现
int main()
{
Node *worker;
int flag;
worker = (Node*)malloc(sizeof(Node));
worker->next = NULL;
while(1)
{
printf("\t职 工 信 息 管 理 系 统\n");
printf("==================菜 单==================\n ");
printf("1.输入职工信息\n ");
printf("2.修改职工信息\n ");
printf("3.浏览职工信息\n ");
printf("4.查询职工信息\n ");
printf("5.删除职工信息\n ");
printf("6.读取职工信息\n ");
printf("0.退出\n ");
printf("输入你选择的序号:");
scanf("%d", &flag);
switch (flag)
{
case 0: printf(" \n提示:退出系统!\n "); break;
case 1: Add(worker); save(worker); break; //添加职工信息,保存到文件中
case 2: change(worker); break; //修改职工信息
case 3: Disp(worker); break; //显示职工信息
case 4: Cha_xun(worker); break; //查询职工信息
case 5: Delete(worker); break; //删除职工信息
case 6: Du_qu(worker); break; //读取职工信息
default: printf("提示:输入错误!\n ");
}
}
}
采用尾插法,先建立链表和头结点,新增加一个节点,输入职工的所有信息,将新增的节点连接在链表的尾端。
修改信息模块:void change( Node *worker )
找到要修改的职工信息,删除这一个节点,然后新建一个节点,输入要修改的信息,并储存到新的节点中,将新增的节点放在原来删除节点的位置。
先新建一个指针指向头结点,判断指针域是否为空,若为空,输出“没有信息可以显示”;若不为空,则输出他的指针域所指向的节点储存的信息,并将指针向后移一个节点,直到P指向空,这样就输出了所有的职工信息。
分为两种查找方法,按职工号查找和按姓名查找。
按职工号查找: 输入职工号,先新建一个指针指向头结点,判断指针域是否为空,若为空,输出“没有资料可以查询”;若不为空,则判断他的指针域所指向的节点储存的职工号是否与输入的职工号相同,若相同,则输出该职工所有的信息,并将指针向后移一个节点,再次进行判断,直到P指向空,这样就查找输出了所有匹配的职工信息。
按姓名查找:输入姓名,先新建一个指针指向头结点,判断指针域是否为空,若为空,输出“没有资料可以查询”;若不为空,则判断他的指针域所指向的节点储存的职工姓名是否与输入的职工姓名相同,若相同,则输出该职工所有的信息,并将指针向后移一个节点,再次进行判断,直到P指向空,这样就查找输出了所有匹配的职工信息。
查找到要删除的职工信息节点,删除这一个节点,并将它的前驱节点的指针域指向后继节点。
新建一个指针指向头结点,判断指针域是否为空,若为空,输出“没有记录!”,若不为空, fprintf()格式写函数 ,将职工信息以%s的格式写入指针指向的文件中。
打开文件,fscanf()格式读函数,以%s 的格式从文件中读取数据存入节点中。