请问一下这个怎么弄,没什么头绪

img


这个不是homework,毕业以后才发现数据结构的重要性,想回过头补习一下,想请问一下这个的思路,代码怎么写

探讨一下大概思路哈:
项目和学校各设一个结构体,如下:

//项目结构体
typedef struct project{
    int prjID;    //项目编号
    char* prjName[];    //项目名
    int prjScore;    //某学校在本项目取得的分数
    int prjScID;    //该学校ID
    char* prjScoreStuName[];    //取得该分数的学生姓名
    struct project *next;    //用来支持一个同项目根据分数排序的链表
}project_t;

//学校结构体
typedef struct school{
    int scID;    //学校编号
    char* scName[];    //学校名
    project_t* scPrj[m+w];    //记录本学校在所有项目中的成绩,无成绩的项目为空指针NULL
}school_t;

有了结构体后,再维护两张表,一张是全体项目表,一张是全体学校表:

//因为规定了最大数量,所以若不知道具体数量时下列两表的[]内也可以直接使用限定的最大数量
project_t* allPrjTbl[m+w];    //全体项目表
school_t* allScTbl[n];          //全体学校表

完成以上步骤后,就可以支持需要的功能了:

//我不知道具体输入方式,所以以数组为例写下大概逻辑,假定输入都是有序的
//功能函数我就不写具体实现了,根据函数名应该能看出它的作用
1.输入项目成绩,假定各输入数据都由第1名在前按序排列
void input_project_score(int prjID, char* prjName, int *score, int score_num, int* scID, char** stuName)
{
    for (int i = 0; i < score_num; i++)
    {
        project_t* newPrjNode = creat_project_node(prjID, prjName, score[i], scID[i], stuName[i]);
        //新记录入表
        if (i == 0)
        {
            allPrjTbl[prjID] = newPrjNode;
        }
        else
        {
            find_list_tail(allPrjTbl[prjID])->next = newPrjNode;
        }
        allScTbl[scID[i]].scPrj[prjID] = newPrjNode;    //记录到对应学校
    }
}

2.统计各学校总分,这里就写一下单个的,所有学校的就根据allScTbl来就好
int get_school_score_sum(int scID)
{
    int score_sum = 0;
    for (int i = 0; i < m+w; i++)
    {
        score_sum += allScTbl[scID].scPrj[i]->prjScore;
    }
    return score_sum;
}

3.按学校编号、学校总分、男女团体总分排序输出
//就不写了,思路和上面是一样的,就是输出内容不一样而已

4.按学校编号查询学校某个项目的情况
project_t* get_school_project(int scID, int prjID)
{
    return allScTbl[scID].scPrj[i];
}

5.按项目编号查询取得前三或前五的学校
//在这个例子的录入方法下,allPrjTbl[prjID]就是一张按成绩排序的链表,查询这个链表的每个节点的prjScID,再拿这个ID从allScTbl表找就好了

大概思路就是以上这样,输入输出方式不影响这些逻辑

可以参考这个,一样的

运动会分数统计系统
https://blog.csdn.net/weixin_43811333/article/details/104806493