多重表,是在《数据结构与算法分析—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));

最低0.47元/天 解锁文章
2884

被折叠的 条评论
为什么被折叠?



