长风绕旗文艺复兴 2022-01-03 14:07 采纳率: 100%
浏览 308
已结题

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

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

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

1条回答 默认 最新

  • 关注

    参考如下:

    
    #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;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 1月13日
  • 已采纳回答 1月5日
  • 修改了问题 1月3日
  • 修改了问题 1月3日
  • 展开全部

悬赏问题

  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题