数据结构(行政机构管理查询系统)

行政管理是一个树形结构。(确定合适的树的存储结构以方便功能实现!)
功能:

  1. 已知一个部门查询该部门的直接上级部门
  2. 已知一个部门查询它的直接下属部门
  3. 查询一个部门的级别
  4. 查询一个部门的兄弟部门信息
  5. 查询某部门的所有各级别的上级部门信息

参考如下:


#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;
}