PTA 7-47 打印选课学生名单分数 25 分 (C 邻接表+二叉排序树 )
题目:
假设全校有最多40000名学生和最多2500门课程。现给出每个学生的选课清单,要求输出每门课的选课学生名单。
输入格式:
输入的第一行是两个正整数:N(≤40000),为全校学生总数;K(≤2500),为总课程数。此后N行,每行包括一个学生姓名(3个大写英文字母+1位数字)、一个正整数C(≤20)代表该生所选的课程门数、随后是C个课程编号。简单起见,课程从1到K编号。
输出格式:
顺序输出课程1到K的选课学生名单。格式为:对每一门课,首先在一行中输出课程编号和选课学生总数(之间用空格分隔),之后在第二行按字典序输出学生名单,每个学生名字占一行。
输入样例:
10 5
ZOE1 2 4 5
ANN0 3 5 2 1
BOB5 5 3 4 2 1 5
JOE4 1 2
JAY9 4 1 2 5 4
FRA8 3 4 2 5
DON2 2 4 5
AMY7 1 5
KAT3 3 5 4 2
LOR6 4 2 4 1 5
输出样例:
1 4
ANN0
BOB5
JAY9
LOR6
2 7
ANN0
BOB5
FRA8
JAY9
JOE4
KAT3
LOR6
3 1
BOB5
4 7
BOB5
DON2
FRA8
JAY9
KAT3
LOR6
ZOE1
5 9
AMY7
ANN0
BOB5
DON2
FRA8
JAY9
KAT3
LOR6
ZOE1
思路:
1.建立邻接表。
2.邻接表的next为二叉排序树的树根
3.用中序遍历打印结果
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>typedef struct a{char name[5];struct a *Lchild,*Rchild;
}Element;typedef struct b{int count;struct a *next;
}ListHead;void InsertList(ListHead *); // 输入节点
void InsertTree(Element *,Element *); // 使用二叉排序树储存
void DataPrint(Element *); // 中序遍历输出int main() {int N,K;scanf("%d %d",&N,&K);ListHead list[K+1];for (int i=0;i<=K;i++){list[i].next=NULL;list[i].count=0;} // 初始化课程链表for (int i=0;i<N;i++) InsertList(list); // 在邻接表中使用二叉排序树for (int i=1;i<=K;i++) {printf("%d %d\n",i,list[i].count);DataPrint(list[i].next);} // 中序遍历输出return 0;
}void InsertList(ListHead *list){char name[5];int n,k; // n是课程数, k 是课程名称scanf("%s %d",name,&n);for (int i=0;i<n;i++){scanf("%d",&k);Element *temp=(Element *)malloc(sizeof(Element));strcpy(temp->name,name);temp->Lchild=temp->Rchild=NULL;if (list[k].next==NULL) list[k].next=temp; // 树根是否为空else InsertTree(temp,list[k].next);list[k].count++;}
}void InsertTree(Element *node,Element *head){if (strncmp(node->name,head->name,4)>0) {if (head->Rchild==NULL) {head->Rchild=node;return;}InsertTree(node,head->Rchild);} // 放入右子树else{if (head->Lchild==NULL){head->Lchild=node;return;}InsertTree(node,head->Lchild);} // 放入左子树
}void DataPrint(Element *list){if (list==NULL) return;DataPrint(list->Lchild);printf("%s\n",list->name);DataPrint(list->Rchild);
}
测试结果:
PTA 7-47 打印选课学生名单分数 25 分 (C 邻接表+二叉排序树 )相关推荐
- 打印选课学生名单 (25 分)
假设全校有最多40000名学生和最多2500门课程.现给出每个学生的选课清单,要求输出每门课的选课学生名单. 输入格式: 输入的第一行是两个正整数:N(≤40000),为全校学生总数:K(≤2500) ...
- 7-47 打印选课学生名单(25 分)
假设全校有最多 40000 名学生和最多 2500 门课程.现给出每个学生的选课清单,要求输出每门课的选课学生名单. 输入格式: 输入的第一行是两个正整数:N(≤40000),为全校学生总数:K(≤2 ...
- 7-47 打印选课学生名单 (25 分)
假设全校有最多40000名学生和最多2500门课程.现给出每个学生的选课清单,要求输出每门课的选课学生名单. 输入格式: 输入的第一行是两个正整数:N(≤40000),为全校学生总数:K(≤2500) ...
- 7-14 打印选课学生名单(25 分)
假设全校有最多40000名学生和最多2500门课程.现给出每个学生的选课清单,要求输出每门课的选课学生名单. 输入格式: 输入的第一行是两个正整数:N(≤40000),为全校学生总数:K(≤2500) ...
- 7-70 打印选课学生名单 (25 分)
#include<stdio.h> #include<string.h> int main() {int a[100][10],b[100][1000],i,j,k,n,p,p ...
- 打印选课学生名单(25)
假设全校有最多40000名学生和最多2500门课程.现给出每个学生的选课清单,要求输出每门课的选课学生名单. 输入格式: 输入的第一行是两个正整数:N(≤40000),为全校学生总数:K(≤2500) ...
- 5 打印选课学生名单
5 打印选课学生名单 分数 25 作者 DS课程组 单位 浙江大学 假设全校有最多40000名学生和最多2500门课程.现给出每个学生的选课清单,要求输出每门课的选课学生名单. 输入格式: 输入的第一 ...
- 打印选课学生名单 (25分)
打印选课学生名单 (25分) 假设全校有最多40000名学生和最多2500门课程.现给出每个学生的选课清单,要求输出每门课的选课学生名单. 输入格式: 输入的第一行是两个正整数:N(≤40000),为 ...
- 5 打印选课学生名单 (25分)
5 打印选课学生名单 (25分) 假设全校有最多40000名学生和最多2500门课程.现给出每个学生的选课清单,要求输出每门课的选课学生名单. 输入格式: 输入的第一行是两个正整数:N(≤40000) ...
最新文章
- sbt+Scala IDE建立Scala项目
- Educational Codeforces Round 41(已补D,E)
- 7-2 旅行售货员 (10 分)(TSP问题思路加详解)
- 牛客网--整数与IP地址间的转换
- 今年因为疫情很多信用卡逾期,结果会怎么样?
- vmware 网络连接方式的说明
- 【ACL2019】看 NLP 未来发展趋势
- 【转载】卸载Sql Server 2014数据库
- linux kernel map
- java jxls_jxls教程
- 2008年全国计算机软考程序员考试大纲
- 如何使用fiddler抓取APP接口
- HTML Canvas 刮刮卡抽奖效果的实现
- 题源报刊精品阅读-词汇1
- 18岁开始学习编程是否来得及?
- 9款免费且超实用的响应式网页测试工具
- python生成条形码 修改图片大小
- python中circle是什么意思_啥是佩奇,让 Python 告诉你!
- 论文写作 8: 关键词的写法
- Python学习笔记:7.2.2 Django快速建站 - MTV模式