7-49 打印学生选课清单 (25分)

 

 解题思路:(此前用哈希表存储学生选课信息,最后一个测试点超时,或者内存超限)

后在网上翻看其他大能写的文章,受益颇多

注意到学生姓名的组成是3个大写字母+1个数字,故可开辟一个四维结构体数组指针,使学生姓名映射到唯一地址,也省去了用哈希函数要解决冲突的时间消耗问题;再将学生的选课清单用单链表结构存储

#include <stdio.h>
#include <malloc.h>

typedef struct Node {
    int Course;
    struct Node *Next;
}Node;
typedef
char Element[5]; Node *Insert(Node *sort,int k); void Out(Node *head,int N); int main(int argc,char **argv) { int i,j,k,t; int n,m; int CourseNo,Num; Element Name; Node *List[26][26][26][10]; for(i=0; i<26; i++) { for(j=0; j<26; j++) { for(k=0; k<26; k++) { for(t=0; t<10; t++) { List[i][j][k][t]=NULL; } } } } scanf("%d %d",&n,&m); for(i=0;i<m;i++) { scanf("%d %d",&CourseNo,&Num); for(j=0;j<Num;j++) { scanf("%s",Name); List[Name[0]-'A'][Name[1]-'A'][Name[2]-'A'][Name[3]-'0'] =Insert(List[Name[0]-'A'][Name[1]-'A'][Name[2]-'A'][Name[3]-'0'],CourseNo); } } for(i=0;i<n;i++) { scanf("%s",Name); printf("%s",Name); Out(List[Name[0]-'A'][Name[1]-'A'][Name[2]-'A'][Name[3]-'0'],0); printf("\n"); } } Node *Insert(Node *sort,int k) { if(!sort||sort->Course<k) { Node *n=malloc(sizeof(struct Node)); n->Course=k; n->Next=sort; return n; } else if(sort->Course!=k) sort->Next=Insert(sort->Next,k); return sort; } void Out(Node *head,int N) { if(head) { Out(head->Next,++N); printf(" %d",head->Course); } else printf(" %d",N); }

猜你喜欢

转载自www.cnblogs.com/snzhong/p/12665777.html
今日推荐