#includetypedef struct w //节点结构体
{
int no;
char name[100];
int depno;
int salary;
struct w* next;
} worker;
void input(worker*&L) //选项1的功能,也是题目(2)小题
{ //输入一个职工记录
worker*p; //∵不用排序也没有尾节点∴考虑方便的头插法
p=(worker*)malloc(sizeof(worker));
printf("请按顺序分别输入职工编号,姓名,部门,工资(两信息间用空格分离)\n");
scanf("%d %s %d %d",&p->no,&p->name,&p->depno,&p->salary);
p->next=L->next;
L->next=p;
}
void show(worker*L) //选项2的功能,也是题目(3)小题
{ //显示所有职工记录
worker*p=L->next;
printf("工号 姓名 部门 工资\n");
for(p=L->next;p!=NULL;p=p->next)
printf("%d %s %d %d\n",p->no,p->name,p->depno,p->salary);
}
void num_sort(worker*&L) //选项3的功能,也是题目(4)小题
{ //按工号升序排序,插入排序
worker*p,*q,*s; //p指向已排序列待插入位置的前驱节点,q指向未排序列第一个节点(既指向待插入节点)
if(L->next==NULL) //由于所有函数均不判断L空,所有这里也默认L不空(整个程序不会出现空值传进来的情况)
{
printf("链表为空\n");
return;
}
q=L->next->next;
L->next->next=NULL; //断开已排序列与未排序列,以保证排序完毕后最后节点->next为空
while(q!=NULL)
{
p=L;
while(p->next!=NULL && q->no >= p->next->no) //如果待插入位置节点no值≥待插入节点,则待插位置后移
p=p->next;
s=q->next; //已找到正确插入位置,将p节点插入到pre节点的后面
q->next=p->next;
p->next=q;
q=s;
}
printf("已排序完毕\n");
}
void dep_sort(worker*&L) //选项4的功能,也是题目(5)小题
{ //按部门升序排序
worker*p,*q,*s; //算法与num_sort一致,不再叙述
if(L->next==NULL)
{
printf("链表为空\n");
return;
}
q=L->next->next;
L->next->next=NULL;
while(q!=NULL)
{
p=L;
while(p->next!=NULL && q->depno >= p->next->depno)
p=p->next;
s=q->next;
q->next=p->next;
p->next=q;
q=s;
}
printf("已排序完毕\n");
}
void sal_sort(worker*&L) //选项5的功能,也是题目(6)小题
{ //按工资升序排序
worker*p,*q,*s; //算法与num_sort一致,不再叙述
if(L->next==NULL)
{
printf("链表为空\n");
return;
}
q=L->next->next;
L->next->next=NULL;
while(q!=NULL)
{
p=L;
while(p->next!=NULL && q->salary >= p->next->salary)
p=p->next;
s=q->next;
q->next=p->next;
p->next=q;
q=s;
}
printf("已排序完毕\n");
}
void Delete(worker*&L) //选项6的功能,也是题目(7)小题
{ //按工号删除一个职工记录
worker*p,*dele; //算法与num_sort一致,不再叙述
int a;
printf("请输入要删除职工记录的工号:");
scanf("%d",&a);
for(p=L;p->next!=NULL;p=p->next) //p指向被删节点的前驱节点
if(p->next->no == a) //执行删除操作
{
dele=p->next;
p->next=dele->next;
free(dele);
printf("已删除工号为%d的职工记录\n",a);
return;
}
printf("未找到工号为%d的职工记录\n",a);
}
void destroy(worker*&L) //选项7的功能,也是题目(8)小题
{ //删除全部职工记录,这里不删除头结点
worker*p=L->next,*q;
while(p!=NULL)
{
q=p;
p=p->next;
free(q);
}
L->next=NULL;
printf("已删除全部职工记录\n");
}
void end(worker*&L) //选项8的功能,自己加的功能,不是题目要求
{ //删除全部记录并结束程序
destroy(L);
free(L); //调用end之后主函数结束,不会再访问L,所以释放空间
}
void menu()
{
printf(" ┏━━━━━━━━━━━━━━━┓\n");
printf(" ┃ 菜单 ┃\n");
printf(" ┠┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨\n");
printf(" ┠输入1:输入一个职工记录 ┃\n"); //本题不考虑文件OI,所以省去OI部分
printf(" ┠输入2:显示所有职工记录 ┃\n");
printf(" ┠输入3:按工号升序排序 ┃\n");
printf(" ┠输入4:按部门升序排序 ┃\n");
printf(" ┠输入5:按工资升序排序 ┃\n");
printf(" ┠输入6:按工号删除一个职工记录 ┃\n");
printf(" ┠输入7:删除全部职工记录 ┃\n");
printf(" ┠输入8:删除全部记录并结束程序 ┃\n"); //第八条为自己加的功能,不是题目要求
printf(" ┗━━━━━━━━━━━━━━━┛\n\n");
}
void main()
{
int option,T=0; //option记录输入选项号,T为辅助变量
menu();
worker*L=(worker*)malloc(sizeof(worker));
L->next=NULL;
for(;;)
{
printf("请输入选项序号: ");
scanf("%d",&option);
switch(option)
{
case 1:
input(L);
break;
case 2:
show(L);
break;
case 3:
num_sort(L);
break;
case 4:
dep_sort(L);
break;
case 5:
sal_sort(L);
break;
case 6:
Delete(L);
break;
case 7:
destroy(L); //这里不删除头结点
break;
case 8: //这里为自己加的功能,所以实现并没有全部放在一个函数里
end(L);
T=1;
break;
default:
printf("选项序号输入错误,请重新输入!\n");
}
if(T)
break;
}
printf("程序运行结束!\n");
}
已知职工表分别做出hbase逻辑视图和物理视图 已知职工记录描述如下
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
如何在Odoo中利用SQL视图创建动态视图
odoo sql 视图
SQL 数据 菜单项 -
C++多态实现职工管理系统
C++多态实现职工管理系统
#include ios ci -
透视Hbase数据模型|概念视图|物理视图
在 HBase 中,数据存储在有行和列的表中。这是与关系数据库 (RDBMS) 的术语重叠,但这不是一个有用的类比。
hbase 大数据 hbase 数据模型 hbase原理 hbase模型 -
局职工上网信息表
局职工上网信息登记表
职场 休闲