数据结构作业职工信息管理系统

伊始

第一次写博客记录一下大一的一次作业,希望对大家有所帮助。


实验内容

设有一个职工文件xx.xxx(通过解压xx.xxx得到),每个职工记录包含职工编号(no)、姓名(name)、部分(depno)和工资数(salary)信息。设计一个程序,完成如下功能:

  1. 从xx.xxx文件中读出职工记录,并建立一个带头结点的单链表L。
  2. 输入一个职工记录。
  3. 显示所有职工记录。
  4. 按编号no对所有职工记录进行递增排序。
  5. 按部门号depno对所有职工记录进行递增排序。
  6. 按工资数salary对所有职工记录进行递增排序。
  7. 删除指定的职工号的职工记录。
  8. 删除职工文件中的全部记录。
  9. 将单链表L中的所有职工记录存储到职工文件xx.xxx中

实验原理

本次作业是对大一阶段所学习的数据结构内的单链表知识点和C语言的文件存取和运用等知识点的考察

单链表的基本操作

单链表是一种数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。常见的基本操作有以下几种:

1. 创建链表:创建一个空链表,可选择是否给链表头节点赋值。

2. 插入节点:在链表的特定位置插入一个新节点,需要考虑插入位置是否合法。

3. 删除节点:从链表中删除一个指定位置的节点,需要考虑删除位置是否合法。

4. 遍历链表:按照顺序遍历链表中的所有节点,访问节点的数据。

5. 查找节点:根据节点的值查找在链表中的位置。

6. 获取链表长度:返回链表中节点的个数。

这些基本操作可以根据具体的需求进行扩展和优化,比如添加头节点和尾节点指针,插入排序,反转链表等。

文件基本操作

  1. 创建文件:可以使用文件管理工具或编程语言中的文件相关函数创建新文件。

  2. 打开文件:通过指定文件路径和文件名,可以打开文件以便进行读写操作。在打开文件时,需要指定打开模式,如只读模式、写入模式、追加模式等。

  3. 读取文件:可以使用文件相关函数从文件中读取数据,读取的数据可以是文本、二进制等格式。

  4. 写入文件:可以使用文件相关函数向文件中写入数据,写入的数据可以是文本、二进制等格式。在写入文件时,可以选择覆盖原有内容或追加到文件末尾。

开始之前要先分析一下程序的结构,可以在编写代码事半功倍。

实验程序的结构如图所示:

实现代码

首先头文记,单链表的存储结构

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include<string.h>
#pragma warning(disable:4996)
typedef struct {
	int no;//职工号
	char name[10];//名字
	int departno;  //部门号
	float salary; //薪水
}EmpType;
typedef struct LNode {
	EmpType data;//结点的数据域,用于存取一个员工的信息
	LNode* next;结点的指针域,指向下一个指针
}EmpList;//EmpList为一个节点

然后初始化单链表

int Initlist(EmpList*& L)
{
	L = (EmpList*)malloc(sizeof(EmpList));
	if (L != NULL)
	{
		L->next = NULL;
		return 1;
	}
	else
	{
		printf("内存不足!\n");
		return 0;
	}
}

功能实现

1.从xx.xxx文件中读出职工记录,并建立一个带头结点的单链表L

void ReadFile(EmpList*& L)
{    
	
	FILE* fp;
	if ((fp = fopen("xx.xxx", "r")) == NULL) {
		printf("提示:文件不存在\n");
		return;
	}
	int no;
	char name[10];
	int departno;  
	float salary;
		printf("打开成功,从文件中读出职工记录,并创建一个单链表\n");
		while(fscanf(fp, "%d%s%d%f", &no, &name, &departno, &salary) != EOF)	
			{
				EmpList* q = (EmpList*)malloc(sizeof(EmpList));
				q->data.no = no;
				strcpy(q->data.name, name);
				q->data.departno = departno;
				q->data.salary = salary;
			    q->next = L->next;
			    L->next = q; 
				
			}
			  
				
	  	
	 
	fclose(fp);

}

2.输入一个职工记录

/*录入职工信息*/ //采用头插法 
int CreateListF(EmpList*& L)
{
	
	EmpList* q =(EmpList*)malloc(sizeof(EmpList));
		printf("请输入职工号(数字):");
		scanf("%d", &q->data.no);
		EmpList* s = L->next;
		while (s)
		{
			if (s->data.no == q->data.no)
			{
				free(q);
				printf("录入失败提示:此职工号已经存在!\n");
				return -1;
			}
			s = s->next;
		}
		printf("请输入职工姓名(文字):");
		scanf("%s", q->data.name);
		printf("请输入职工部门号(数字):");
		scanf("%d", &q->data.departno);
		printf("请输入职工工资数(数字):");
		scanf("%f", &q->data.salary);
		q->next = L->next;
		L->next = q;
		printf("录入成功!\n");
		return 1;
	
}

3.显示所有职工记录

//浏览职工信息
void show(EmpList* L)
{
	menu();
	printf("浏览职工信息\n");
	printf("职工号\t姓名\t部门号\t工资\t\n");
	while (L->next != NULL)
	{
		printf("%d\t%s\t%d\t%f\t\n", L->next->data.no, L->next->data.name, L->next->data.departno, L->next->data.salary);
		L = L->next;
	}
	printf("显示完毕!\n");
}

4.按编号no对所有职工记录进行递增排序。

//职工号排序
EmpList nolist(EmpList*& L)
{
    EmpList* p = L->next;
    EmpList* r = p->next;
    EmpList* q;
    EmpList* pre;
    p->next = NULL;
    p = r;
    while (p != NULL)
    {
        r = p->next;
        q = L;
        while (q->next != NULL && q->next->data.no < p->data.no)
        {
            q = q->next;
        }
        pre = q;
        p->next = pre->next;
        pre->next = p;
        p = r;
    }
    return *L;
}

5.按部门号depno对所有职工记录进行递增排序。

//部门号排序
EmpList depnolist(EmpList*& L)
{
	EmpList* p = L->next;
	EmpList* r = p->next;
	EmpList* q;
	EmpList* pre;
	p->next = NULL;
	p = r;
	while (p != NULL)
	{
		r = p->next;
		q = L;
		while (q->next != NULL && q->next->data.departno < p->data.departno)
		{
			q = q->next;
		}
		pre = q;
		p->next = pre->next;
		pre->next = p;
		p = r;
	}
	return *L;
}

6.按工资数salary对所有职工记录进行递增排序。

//工资排序 
EmpList salarylist(EmpList*& L)
{
	EmpList * p = L->next;
	EmpList * r = p->next;
	EmpList * q;
	EmpList * pre;
	p->next = NULL;
	p = r;
	while (p != NULL)
	{
		r = p->next;
		q = L;
		while (q->next != NULL && q->next->data.salary < p->data.salary)
		{
			q = q->next;
		}
		pre = q;
		p->next = pre->next;
		pre->next = p;
		p = r;
	}
	return *L;
}

7.删除指定的职工号的职工记录。

//按职工号删除职工信息
int deleteone(EmpList*& L, int no)
{
	menu();
	printf("正在按职工号删除职工信息\n");
	EmpList* k = L;
	while (k->next != NULL)
	{
		if (k->next->data.no == no)
		{
			EmpList* q = k->next;
			k->next = q->next;
			free(q);
			printf("删除职工号%d成功!\n", no);
			return 1;
		}
		k = k->next;
	}
	printf("没有你输入的职工号!\n");
	return -1;
}

8.删除职工文件中的全部记录。

void deleteall(EmpList*& L)
{
	while (L->next != NULL)
	{
		EmpList* q = L->next;
		L->next = L->next->next;
		free(q);
	}
}

9.将单链表L中的所有职工记录存储到职工文件xx.xxx中

void SaveFile(EmpList* L) {
	EmpList* q = L->next; // 从第一个数据节点开始遍历
	int n = 0; // 记录写入的职工记录数量
	FILE* fp;
	if ((fp = fopen("xx.xxx", "w")) == NULL) {
		printf("提示:文件不存在\n");
		return;
	}
	else {
		printf("保存成功\n");
	}
	
	while (q != NULL) {
		// 将职工信息写入文件
		fprintf(fp, "%d\t%s\t%d\t%f\n", q->data.no, q->data.name, q->data.departno, q->data.salary);
		q = q->next; // 移动到下一个节点
		n++;
	}
	fclose(fp);
	if (n > 0)
		printf("%d个职工记录写入文件xx.xxx\n", n);
	else
		printf("没有任何职工记录写入xx.xxx文件\n");
	free(L);
}

代码总结

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include<string.h>
#pragma warning(disable:4996)
typedef struct {
	int no;
	char name[10];
	int departno;  //部门
	float salary;
}EmpType;
typedef struct LNode {
	EmpType data;
	LNode* next;
}EmpList;

void menu() {

	system("cls");//清屏
	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("         【8】  删除全部职工记录 \n");
	printf("         【9】  清屏\n");
	printf("         【10】  储存信息并退出\n");
	printf("         【-1】 退出程序\n");
	printf(" ********************************************\n");
}


int Initlist(EmpList*& L)
{
	L = (EmpList*)malloc(sizeof(EmpList));
	if (L != NULL)
	{
		L->next = NULL;
		return 1;
	}
	else
	{
		printf("内存不足!\n");
		return 0;
	}
}


void SaveFile(EmpList* L) {
	EmpList* q = L->next; // 从第一个数据节点开始遍历
	int n = 0; // 记录写入的职工记录数量
	FILE* fp;
	if ((fp = fopen("xx.xxx", "w")) == NULL) {
		printf("提示:文件不存在\n");
		return;
	}
	else {
		printf("保存成功\n");
	}
	
	while (q != NULL) {
		// 将职工信息写入文件
		fprintf(fp, "%d\t%s\t%d\t%f\n", q->data.no, q->data.name, q->data.departno, q->data.salary);
		q = q->next; // 移动到下一个节点
		n++;
	}
	fclose(fp);
	if (n > 0)
		printf("%d个职工记录写入文件xx.xxx\n", n);
	else
		printf("没有任何职工记录写入xx.xxx文件\n");
	free(L);
}

/*录入职工信息*/ //采用头插法 
int CreateListF(EmpList*& L)
{
	
	EmpList* q =(EmpList*)malloc(sizeof(EmpList));
		printf("请输入职工号(数字):");
		scanf("%d", &q->data.no);
		EmpList* s = L->next;
		while (s)
		{
			if (s->data.no == q->data.no)
			{
				free(q);
				printf("录入失败提示:此职工号已经存在!\n");
				return -1;
			}
			s = s->next;
		}
		printf("请输入职工姓名(文字):");
		scanf("%s", q->data.name);
		printf("请输入职工部门号(数字):");
		scanf("%d", &q->data.departno);
		printf("请输入职工工资数(数字):");
		scanf("%f", &q->data.salary);
		q->next = L->next;
		L->next = q;
		printf("录入成功!\n");
		return 1;
	
}
//职工号排序
EmpList nolist(EmpList*& L)
{
	EmpList* p = L->next;
	EmpList* r = p->next;
	EmpList* q;
	EmpList* pre;
	p->next = NULL;
	p = r;
	while (p != NULL)
	{
		r = p->next;
		q = L;
		while (q->next != NULL && q->next->data.no < p->data.no)
		{
			q = q->next;
		}
		pre = q;
		p->next = pre->next;
		pre->next = p;
		p = r;
	}
	return *L;
}
//部门号排序
EmpList depnolist(EmpList*& L)
{
	EmpList* p = L->next;
	EmpList* r = p->next;
	EmpList* q;
	EmpList* pre;
	p->next = NULL;
	p = r;
	while (p != NULL)
	{
		r = p->next;
		q = L;
		while (q->next != NULL && q->next->data.departno < p->data.departno)
		{
			q = q->next;
		}
		pre = q;
		p->next = pre->next;
		pre->next = p;
		p = r;
	}
	return *L;
}
//工资排序 
EmpList salarylist(EmpList*& L)
{
	EmpList * p = L->next;
	EmpList * r = p->next;
	EmpList * q;
	EmpList * pre;
	p->next = NULL;
	p = r;
	while (p != NULL)
	{
		r = p->next;
		q = L;
		while (q->next != NULL && q->next->data.salary < p->data.salary)
		{
			q = q->next;
		}
		pre = q;
		p->next = pre->next;
		pre->next = p;
		p = r;
	}
	return *L;
}
//按职工号删除职工信息
int deleteone(EmpList*& L, int no)
{
	menu();
	printf("正在按职工号删除职工信息\n");
	EmpList* k = L;
	while (k->next != NULL)
	{
		if (k->next->data.no == no)
		{
			EmpList* q = k->next;
			k->next = q->next;
			free(q);
			printf("删除职工号%d成功!\n", no);
			return 1;
		}
		k = k->next;
	}
	printf("没有你输入的职工号!\n");
	return -1;
}
//删除全部员工记录(修改已正常)
void deleteall(EmpList*& L)
{
	while (L->next != NULL)
	{
		EmpList* q = L->next;
		L->next = L->next->next;
		free(q);
	}
}
//浏览职工信息
void show(EmpList* L)
{
	menu();
	printf("浏览职工信息\n");
	printf("职工号\t姓名\t部门号\t工资\t\n");
	while (L->next != NULL)
	{
		printf("%d\t%s\t%d\t%f\t\n", L->next->data.no, L->next->data.name, L->next->data.departno, L->next->data.salary);
		L = L->next;
	}
	printf("显示完毕!\n");
}
void ReadFile(EmpList*& L)
{    
	
	FILE* fp;
	if ((fp = fopen("xx.xxx", "r")) == NULL) {
		printf("提示:文件不存在\n");
		return;
	}
	int no;
	char name[10];
	int departno;  
	float salary;
		printf("打开成功,从文件中读出职工记录,并创建一个单链表\n");
		while(fscanf(fp, "%d%s%d%f", &no, &name, &departno, &salary) != EOF)	
			{
				EmpList* q = (EmpList*)malloc(sizeof(EmpList));
				q->data.no = no;
				strcpy(q->data.name, name);
				q->data.departno = departno;
				q->data.salary = salary;
			    q->next = L->next;
			    L->next = q; 
				
			}
			  
				
	  	
	 
	fclose(fp);

}


int main() {
	int ord = 0;
	int no;
	EmpList* L;
	if (!(Initlist(L)))
		exit(0);
	while (ord != -1) {
		switch (ord) {
		case 0:
			menu();
			break;
		case 1:
			ReadFile(L); 
			break;
		case 2:
			CreateListF(L);
			break;
		case 3:
			show(L);
			break;
		case 4:
			nolist(L);
			show(L);
			printf("按职工号排列成功!\n");
			break;
		case 5:
			depnolist(L);
			show(L);
			printf("按部门号排列成功!\n");
			break;
		case 6:
			salarylist(L);
			show(L);
			printf("按工资排列成功!\n");
			break;
		case 7:
			printf("请输入要删除的职工号:");
			scanf("%d", &no);
			deleteone(L, no);
			printf("删除成功!\n");
			//show(L);
			break;
		case 8:
			deleteall(L);
			show(L);
			printf("记录为空\n");
			printf("已经删除全部记录!\n");
			break;
		case 9:
		default:
			menu();
			break;
		case 10:
			SaveFile(L);
			exit(0);
		
		}
		printf("请输入操作命令数字:\n");
		scanf("%d", &ord);
	}
	free(L);
}

总结

以上就是本篇文章全部内容,希望对大家有帮助。

  • 16
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值