伊始
第一次写博客记录一下大一的一次作业,希望对大家有所帮助。
实验内容
设有一个职工文件xx.xxx(通过解压xx.xxx得到),每个职工记录包含职工编号(no)、姓名(name)、部分(depno)和工资数(salary)信息。设计一个程序,完成如下功能:
- 从xx.xxx文件中读出职工记录,并建立一个带头结点的单链表L。
- 输入一个职工记录。
- 显示所有职工记录。
- 按编号no对所有职工记录进行递增排序。
- 按部门号depno对所有职工记录进行递增排序。
- 按工资数salary对所有职工记录进行递增排序。
- 删除指定的职工号的职工记录。
- 删除职工文件中的全部记录。
- 将单链表L中的所有职工记录存储到职工文件xx.xxx中
实验原理
本次作业是对大一阶段所学习的数据结构内的单链表知识点和C语言的文件存取和运用等知识点的考察
单链表的基本操作
单链表是一种数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。常见的基本操作有以下几种:
1. 创建链表:创建一个空链表,可选择是否给链表头节点赋值。
2. 插入节点:在链表的特定位置插入一个新节点,需要考虑插入位置是否合法。
3. 删除节点:从链表中删除一个指定位置的节点,需要考虑删除位置是否合法。
4. 遍历链表:按照顺序遍历链表中的所有节点,访问节点的数据。
5. 查找节点:根据节点的值查找在链表中的位置。
6. 获取链表长度:返回链表中节点的个数。
这些基本操作可以根据具体的需求进行扩展和优化,比如添加头节点和尾节点指针,插入排序,反转链表等。
文件基本操作
-
创建文件:可以使用文件管理工具或编程语言中的文件相关函数创建新文件。
-
打开文件:通过指定文件路径和文件名,可以打开文件以便进行读写操作。在打开文件时,需要指定打开模式,如只读模式、写入模式、追加模式等。
-
读取文件:可以使用文件相关函数从文件中读取数据,读取的数据可以是文本、二进制等格式。
-
写入文件:可以使用文件相关函数向文件中写入数据,写入的数据可以是文本、二进制等格式。在写入文件时,可以选择覆盖原有内容或追加到文件末尾。
开始之前要先分析一下程序的结构,可以在编写代码事半功倍。
实验程序的结构如图所示:
实现代码
首先头文记,单链表的存储结构
#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);
}
总结
以上就是本篇文章全部内容,希望对大家有帮助。