list.h:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
using namespace std;
struct worker
{
char name[25];
int Num;
char position[20];
};
struct node
{
struct worker data;
struct node* pNext;
};
struct node* creatList()
{
struct node* pHead = (struct node*)malloc(sizeof(struct node));
pHead->pNext = NULL;
return pHead;
}
struct node* creatNode(struct worker data)//创建
{
struct node* pNew = (struct node*)malloc(sizeof(struct node));
pNew->data = data;
pNew->pNext = NULL;
return pNew;
}
void insertNode(struct node* pHead, struct worker data)//插入
{
struct node* pNew = creatNode(data);
pNew->pNext = pHead->pNext;
pHead->pNext = pNew;
}
void deleteNode(struct node* pHead, int Num)//删除
{
struct node* pCurrent = pHead->pNext;
struct node* pFront = pHead;
if (pCurrent == NULL)
{
printf("数据为空,无法删除!\n");
return;
}
while (pCurrent->data.Num != Num)
{
pFront = pCurrent;
pCurrent = pCurrent->pNext;
if (pCurrent == NULL)
{
printf("找不到该员工信息!无法删除!\n");
return;
}
}
pFront->pNext = pCurrent->pNext;
free(pCurrent);
}
struct node* searchList(struct node* pHead, int Num)//搜索
{
struct node* p = pHead->pNext;
if (p == NULL)
{
printf("数据为空!\n");
return NULL;
}
while (p->data.Num != Num)
{
p = p->pNext;
}
return p;
}
void readFromFile(struct node* pHead, const char* fileName)//从文件读到程序
{
struct worker data;
FILE* fp;
fp = fopen(fileName, "r");
if (fp == NULL)
{
fp = fopen(fileName, "w+");
}
while (fscanf(fp, "%s\t%d\t%s\n", data.name, &data.Num, data.position) != EOF)
{
insertNode(pHead, data);
}
/*从文件读一行到data里,再把data作为一个节点的数据,插入链表里,一次插一个*/
fclose(fp);
}
void writeInfoToFile(struct node* pHead, const char* fileName)
{
FILE* fp;
fp = fopen(fileName, "w");
if (fp == NULL)
{
printf("文件打开失败!");
return;
}
struct node* p = pHead->pNext;
while (p)
{
fprintf(fp, "%s\t%d\t%s\n", p->data.name, p->data.Num, p->data.position);
p = p->pNext;
}
fclose(fp);
}
void printList(struct node* pHead)//打印
{
struct node* p;
p = pHead->pNext;
printf("Name\tNum\t\Position\n");
while (p)
{
printf("%s\t%d\t%s\n", p->data.name, p->data.Num, p->data.position);
p = p->pNext;
}
printf("\n");
}
main.cpp:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include"list.h"
void menu()
{
printf("------------------------------------\n");
printf("\t\t0.退出系统\n");
printf("\t\t1.员工入职\n");
printf("\t\t2.员工离职\n");
printf("\t\t3.员工查找\n");
printf("\t\t4.名单打印\n");
printf("------------------------------------\n");
}
struct node* list = creatList();
void keyDown()
{
struct worker data;
int choice;
printf("输入选项:");
fflush(stdin);
scanf("%d", &choice);
switch (choice)//每switch到1或者2一次,整个文件都会被清空重写
{
case 0:
printf("系统退出!\n");
exit(0);
break;
case 1:
printf("-----------------员工入职-------------------\n");
printf("输入姓名 员工编号 职位:");
fflush(stdin);
scanf("%s%d%s", data.name, &data.Num, data.position);
insertNode(list, data);
writeInfoToFile(list, "E:\\员工名单.txt");/*在对链表操作完成后,把旧的文件清空,把新的链表全部写进文件里*/
break;
case 2:
printf("-----------------员工离职-------------------\n");
printf("输入删除的员工编号:");
scanf("%d", &data.Num);
deleteNode(list, data.Num);
writeInfoToFile(list, "E:\\员工名单.txt");/*在对链表操作完成后,把旧的文件清空,把新的链表全部写进文件里*/
break;
case 3:
printf("-----------------员工查找-------------------\n");
printf("输入查找的员工编号:");
scanf("%d", &data.Num);
if (searchList(list, data.Num) == NULL)
{
printf("未找到该员工数据!");
}
else
{
printf("%s\t%d\t%s\n", searchList(list, data.Num)->data.name,
searchList(list, data.Num)->data.Num, searchList(list, data.Num)->data.position);
}
break;
case 4:
printf("-----------------名单打印-------------------\n");
printList(list);
break;
default:
printf("选择错误,请重新输入!\n");
break;
}
}
int main()
{
menu();
readFromFile(list, "E:\\员工名单.txt");//把旧文件读到程序的链表里,接下来对链表操作
while (1)
{
keyDown();
}
system("pause");
system("cls");
return 0;
}