链表的应用---学生注册课程(多重表)

多重表,是在《数据结构与算法分析—C语言描述》书上介绍的一种方法,用于解决学生注册问题的。

原题目是,一所有40000名学生和2500门课程的大学需要生成两种类型的报告。第一个报告列出每个班的注册者,第二个报告列出每个学生注册的班级。

常用的实现方法是使用二维数组,这样一个数组将有1亿项。平均一个学生注册三门课程,因此实际上有意义的数据只有120000项,大约占0.1%。

按照书中介绍,利用多重表的方法来替代二维数组的实现,可以节省很多空间,详见下图

这里写图片描述

通过将班级表和学生表串起来,所有的表都各有一个表头并且都是循环的。由上图可以看出,中间的节点有两个指针域,一个指向学生,一个指向班级。

我的实现,并没有用循环链表,每当一个学生注册一门课程的时候,就在该学生的表头插入该课程的信息,在该课程的表头插入该学生的信息。如果需要打印某个学生选了哪些课程,就直接找到这个学生的表头开始遍历,课程也是一样。下面看具体代码实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

#define NAME_LEN 10


/* Assume there have three Courses and four Students */
typedef enum
{
    CHINESE = 1,              
    ENGLISH,
    MATH,                   
}e_COURSE_TYPE;

#define STUA    "Tom"
#define STUB    "Mary"
#define STUC    "Jake"
#define STUD    "Ray"


typedef struct _Node_T
{
    char name[NAME_LEN];
    e_COURSE_TYPE course;       
    struct _Node_T *next;   
}Node;

typedef struct _Node_T * Head;

struct _Node_T * StuA;
struct _Node_T * StuB;
struct _Node_T * StuC;
struct _Node_T * StuD;
struct _Node_T * CourseCH;
struct _Node_T * CourseEN;
struct _Node_T * CourseMA;


Node * multi_lists_make_node(void)
{
    Node  * node = (Node *)malloc(sizeof(Node));
    if(NULL == node)
    {
        printf("node malloc fail!\n");
        return NULL;
    }
    memset(node, 0, sizeof(Node));

    
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值