数据结构第二章设计作业:员工名单(链式存储)

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值