行政管理是一个树形结构。(确定合适的树的存储结构以方便功能实现!)
功能:
- 已知一个部门查询该部门的直接上级部门
- 已知一个部门查询它的直接下属部门
- 查询一个部门的级别
- 查询一个部门的兄弟部门信息
- 查询某部门的所有各级别的上级部门信息
行政管理是一个树形结构。(确定合适的树的存储结构以方便功能实现!)
功能:
参考如下:
#include <stdio.h>
#include <stdlib.h>
#define MAXNMB 10
//定义部门结构体
typedef struct _partmentinfo
{
int id; //部门编号
char name[20]; //部门名称
int uper; //上级单位id(一般只有一个直属上级),无上级时uper = 0
int *subs; //下级单位id(可能有多个下级单位,所以用指针存储)
int subnmb; //下级单位的个数
//部门级别(这个字段也可以不要,递归获取节点的深度即可)
//兄弟部门是同一个上级单位的所有部门,可以通过遍历得到,所以不需要再在结构体中用变量存储
}PARTMENT;
//已知一个部门查询该部门的直接上级部门
PARTMENT* findUper(PARTMENT* a[],int n,int id)
{
int i,j;
for (i=0;i<n;i++)
{
if(a[i]->id == id)
break;
}
if(i != n)
{
for(j=0;j<n;j++)
{
if(a[j]->id == a[i]->uper)
{
printf("%d %s\n",a[j]->id,a[j]->name);
return a[j];
}
}
}
printf("未找到该部门");
return 0; //未找到
}
//已知一个部门查询它的直接下属部门
void findSub(PARTMENT* a[],int n,int id)
{
int i,j,k,t;
int ss = 0;
for (i=0;i<n;i++)
{
if (a[i]->id == id)
{
//*m = a[i]->subnmb;
for (j=0;j<a[i]->subnmb;j++)
{
k = a[i]->subs[j];
for(t=0;t<n;t++)
{
if(a[t]->id == k)
{
printf("%d %s\n",a[t]->id,a[t]->name);
//subs[ss++] = a[t];
}
}
}
}
}
}
//查询一个部门的级别
int findlevel(PARTMENT* a[],int n,int id)
{
int i;
if(id == 0)
return 0;
else
{
for(i=0;i<n;i++)
{
if(a[i]->id == id)
{
return 1 + findlevel(a,n,a[i]->uper);
}
}
if(i == n)
return -1; //没找到该部门,返回-1
}
}
//查询一个部门的兄弟部门信息
void findbrother(PARTMENT* a[],int n,int id)
{
int i,t,j;
PARTMENT* uper = findUper(a,n,id);
if(uper == 0)
{
//printf("未找到该节点");
return ;
}
for (i=0;i<uper->subnmb;i++)
{
t = uper->subs[i];
for(j=0;j<n;j++)
{
if(a[j]->id == t)
{
printf("%d %s\n",a[j]->id,a[j]->name);
}
}
}
}
//查询某部门的所有各级别的上级部门信息
void findAlluper(PARTMENT* a[],int n,int id)
{
int i;
PARTMENT* uper = 0;
if(id ==0)
return;
else
{
uper = findUper(a,n,id);
if(uper)
findAlluper(a,n,uper->id);
}
}
int main()
{
PARTMENT* a[MAXNMB];
int nmb = 0;
char ch;
int i,j;
int id;
//输入时,必须先输入上级,再输入下级(输入下级时,上级单位必须已经存在)
while (1)
{
a[nmb] = (PARTMENT*)malloc(sizeof(PARTMENT));
a[nmb]->subs = 0;
a[nmb]->subnmb = 0;
printf("请输入部门ID:");
scanf("%d",&a[nmb]->id);
getchar(); //接收回车符
printf("请输入部门名称:");
scanf("%d",a[nmb]->name);
printf("请输入上级部门ID:");
while(1)
{
scanf("%d",&a[nmb]->uper);
if(a[nmb]->uper != 0)
{
for (i=0;i<nmb;i++)
{
if(a[i]->id == a[nmb]->uper)
{
a[i]->subnmb += 1;
if(a[i]->subs == 0)
a[i]->subs = (int*)malloc(sizeof(int));
else
a[i]->subs = (int*)realloc(a[i]->subs,(a[i]->subnmb)*sizeof(int));
a[i]->subs[a[i]->subnmb-1] = a[nmb]->id;
break;
}
}
if(i == nmb)
{
printf("未找到该上级,请重新输入上级部门ID:");
}else
break;
}else
{
if(nmb != 0)
{
printf("已有根部门,请重新输入上级部门ID:");
}
}
}
//下级单位id自动挂载,不需要输入
fflush(stdin);
printf("是否继续输入(Y/N):");
ch = getchar();
if(ch == 'y' || ch == 'Y')
continue;
else
break;
}
//1.已知一个部门查询该部门的直接上级部门
printf("请需输入需要查找的部门id:");
scanf("%d",&id);
printf("该部门的上级部门:");
findUper(a,nmb,id); //查找的是该id的上级部门
//2.已知一个部门查询它的直接下属部门
printf("请输入需要查询的部门id:");
scanf("%d",&id);
printf("该部门的直接下属部门:\n");
findSub(a,nmb,id);
//3.查询一个部门的级别
printf("请输入需要查询的部门id:");
scanf("%d",&id);
printf("该部门的级别为:%d\n",findlevel(a,nmb,id));
//4.查询一个部门的兄弟部门信息
printf("请输入需要查询的部门id:");
scanf("%d",&id);
printf("该部门的兄弟部门:\n");
findbrother(a,nmb,id);
//5.查询某部门的所有各级别的上级部门信息
printf("请输入需要查询的部门id:");
scanf("%d",&id);
printf("该部门的所有上级部门:\n");
findAlluper(a,nmb,id);
return 0;
}