1 设计型题目
2.5 某软件公司大约有30名员工,每名员工有姓名、工号、职务等属性,每年都有员工离职和入职。把所有员工建立一个线性表,建立离职和入职函数,当有员工离职或入职时,修改线性表,并且显示最新的员工名单。具体要求:
(1)顺序表存储;实现顺序表的插入、删除、查找、输出等基本操作;调用基本操作完成。
(2)链表存储;实现链表的插入、删除、查找、输出等基本操作;调用基本操作完成。
2 设计型题目解答
【第2.5题解答】
(1)顺序表存储:对顺序表进行增删改查输出,实验结果如图所示
定义一个员工的结构体,包括员工的姓名、工号、职位。将数据类型定义为员工的结构体类型
员工入职:利用顺序表的插入操作将员工信息插入到顺序表中;
员工离职:利用顺序表的删除操作将员工信息删除,找到对应的员工,再将后面的员工往前移;
员工查找:利用顺序表的查找操作对员工进行查找;
实现代码如下所示:
main.c
#include "2.5_1.h"
int main() {
int num,idnum;
List L;
InitList(&L);
while (1) {
WelcomePrint();
scanf_s("%d", &num);
switch (num) {//根据用户输入的值,对应不同的操作
case 1:ListInsert(&L); break;
case 2:ListDelete(&L); break;
case 3: {
printf("请输入员工编号:\n");
scanf_s("%d", &idnum);
ListLocate(L,idnum ); break; }
case 4:ListPrint(L); break;
case 5:exit(-1);
}
}
return 0;
}
2.5_1.h
#pragma once
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define LIST_INT_SIZE 100//线性表初次分配量
#define LISTINCREMENT 2//线性表分配空间的增量
typedef int Status;
typedef struct {
char name[20];
int id;
char position[20];
}Staff; //定义一个员工的结构体类型
typedef Staff ElemType;
typedef struct {
ElemType* elem; //存储空间的首地址
int length;//已经用的长度
int listsize;//当前储存的容量
}List;
Status InitList(List* L);//初始化一个线性链表
Status ListInsert(List* L);//插入元素
Status ListDelete(List* L);//删除元素
Status ListLocate(List L, int n);//查找元素
Status ListPrint(List L);//打印线性表
Status WelcomePrint();//打印输入界面
2.5_1.c
#include "2.5_1.h"
Status InitList(List* L) {
L->elem = (ElemType*)malloc(sizeof(ElemType) * LIST_INT_SIZE);
if (!L) {
exit(OVERFLOW);
}
L->length = 0;
L->listsize = LIST_INT_SIZE;
return OK;
}
Status ListInsert(List* L) {
ElemType* newbase, * p;
if (L->length >= L->listsize) {
//长度大于已有的空间需要重新分配
newbase = (ElemType*)realloc(L->elem,(L->listsize + LISTINCREMENT)
*sizeof(ElemType));
if (!newbase)
{
exit(OVERFLOW);
}
L->elem = newbase;
L->listsize += LISTINCREMENT;
}
Staff a;//输入要插入的员工的信息
printf("Please input name:");
scanf_s("%s", a.name,20);
printf("Please input id number:");
scanf_s("%d", &a.id);
printf("Please input position:");
scanf_s("%s", a.position, 20);
//存储员工的信息
p = L->elem + L->length;
*p = a;
(L->length)++;
printf("\n");
ListPrint(*L); //显示最新的员工信息
return OK;
}
Status ListDelete(List* L) {
ElemType* p = L->elem;
printf("Please input name:");
char a[20];
scanf_s("%s", a, 20);
int num = 0;//查找要删除的元素
while (strcmp((*p).name, a) != 0 && num < L->length) {
num++;
p++;
}
//被删除的元素后面的元素往前移
if (num != L->length) {
for (p; p < (L->elem + L->length); p++) {
*p = *(p + 1);
}
L->length--;
}
ListPrint(*L); //显示最新的员工信息
return OK;
}
Status ListLocate(List L,int n) {
ElemType* p = L.elem;
while (1) {
if ((p->id) == n) break;
p++;
}
printf("员工的姓名:%s\n", p->name);
printf("员工的工号:%d\n", p->id);
printf("员工的职位:%s\n", p->position);
}
Status ListPrint(List L) {
ElemType* p = L.elem;
ElemType* q = L.elem + L.length;
int num = 1;
printf("最新员工信息:\n");
for (p; p < q; p++) {
printf("第%d个员工的信息:\n", num++);
printf("员工的姓名:%s\n", p->name);
printf("员工的工号:%d\n", p->id);
printf("员工的职位:%s\n", p->position);
printf("\n");
}
return OK;
}
Status WelcomePrint() {
printf("\n");
printf("******************系统功能菜单*************************\n");
printf(" ---------------------- ---------------------- \n");
printf(" ********************************************* \n");
printf(" * 1.增加员工信息 * * 2.删除员工信息 * \n");
printf(" * 3.查找员工信息 * * 4.打印所有信息 * \n");
printf(" * 5.退出系统 *\n");
printf(" ********************************************* \n");
printf(" ---------------------- ---------------------- \n");
printf("请选择菜单编号:");
return OK;
}
(2)链表存储;实现链表的插入、删除、查找、输出等基本操作;调用基本操作完成,实验结果如图所示
算法思路:
员工入职:利用链表的插入操作将员工信息插入到链表中;
员工离职:利用链表的删除操作将员工信息删除,找到对应的员工,再将后面的员工往前移;
员工查找:利用链表的查找操作对员工工号进行查找;
实现代码如下所示:
main.c
#include "2.5_2.h"
int main()
{
int item, n; //item用于接收输入的命令,n用于接收输入的职工人数
int id;
char nam[20];
Worker* L = (Worker*)malloc(sizeof(Worker));
L->next = NULL;
do
{
menu();
printf("\n请输入相应的数字,进行相应的操作:\n");
scanf_s("%d", &item);
switch (item) //根据用户输入的不同值,进行选择
{
case 1: //增加员工
printf("请输入您要录入的职工人数:");
scanf_s("%d", &n);
L = CreateList(L, n);;
break;
case 2: //通过工号查找员工
printf("请输入您要查找的职工工号:");
scanf_s("%d",&id);
ListSearch(L, id);
break;
case 3: //删除员工
printf("请输入您要删除的职工工号:");
scanf_s("%d",&id);
DeleteList(L,id);
break;
case 4: //打印所有员工的信息
printf("全部职工的信息如下:\n\n");
Print(L);
break;
case 0: //退出使用
printf("谢谢您使用职工管理系统,即将退出职工管理系统.....");
exit (-1);
break;
}
printf("\n");
} while (1);
return 0;
}
2.5_2.h
#pragma once
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#define OK 1;
#define ERROR 0;
#define OVERFLOW 0
#define TRUE 1
#define FALSE 0
typedef struct worker
{
int no; //职工工号
char name[40]; //姓名
char position[20];//职位
struct worker* next; //指向下一节点的指针
} Worker;
//相关的函数声明
Worker* CreateList(Worker* L, int n);//根据输入的职工人数,批量创建节点
void DeleteList(Worker* L,int n);//删除节点
void ListSearch(Worker* L, int n);
void Input(Worker* p, int i);//为节点的数据域赋值
void Print(Worker* L);//输出整个链表的数据
void menu();//工资管理系统的菜单
2.5_2.c
#include "2.5_2.h"
//根据输入的职工人数,批量创建节点
Worker* CreateList(Worker* L, int n) //n为输入的职工人数
{
int i;
for (i = 0; i < n; i++)
{
Worker* p;//将新生成的节点插入到链表中
p = NULL;
p = (Worker*)malloc(sizeof(Worker));
Input(p, i);//为节点的数据域赋值
p->next = L->next;
L->next = p;
}
return L;
}
void DeleteList(Worker* L, int n) //按姓名删除职工信息
{
//定义p指针指向头节点的指向,定义pre指向头节点,pre始终指向p的前驱节点
Worker* p = L->next, * pre = L;
if (p == NULL)
printf("数据为空,无法删除!");
else
{
while ((p->no) != n)
{
pre = p;
p = pre->next;
if (p == NULL)
{
printf("没有找到相关信息,无法删除\n");
return;
}
}
pre->next = p->next;
free(p);
printf("删除成功");
}
}
void ListSearch(Worker* L, int n) //通过员工的工号查找
{
Worker* p = L->next;
while (p != NULL)
{
if ((p->no) == n)
{
printf("职工编号:"); //输出查找的员工的信息
printf("%d\t\n", p->no);
printf("姓名:");
printf("%s\n", p->name);
printf("\n");
printf("职位:");
printf("%s\n", p->position);
break;
}
else
p = p->next; //若没找到,指向下一个结点
}
}
void Input(Worker* p, int i) //增加员工信息
{
printf("请输入第%d名职工的职工工号:", i + 1);
scanf_s("%d", &p->no);
printf("请输入第%d名职工的姓名:", i + 1);
scanf_s("%s", p->name, 20);
printf("请输入第%d名职工的职位:", i + 1);
scanf_s("%s", p->position, 20);
printf("\n");
}
void Print(Worker* L)//打印所有职工工资信息
{
Worker* p = L->next;
while (p != NULL)
{
printf("职工编号:");
printf("%d\t\n", p->no);
printf("姓名:");
printf("%s\n", p->name, 20);
printf("职位:");
printf("%s\n", p->position, 20);
printf("\n\n");
p = p->next;
}
printf("\n");
}
void menu()
{
printf("▔▔▔▔▔▔欢迎进入工资管理系统▔▔▔▔▔▔\n");
printf("1.录入职工信息 2.按工号查找某个员工\n");
printf("3.删除某个职工信息 4.输出所有职工信息 \n");
printf(" 0.退出 \n");
printf("▁▁▁▁▁▁▁▁谢谢使用▁▁▁▁▁▁▁▁▁\n");
}