看别人设计的数据结构代码时遇到一个问题,需要帮忙理解一下。
背景:这是一个C语言,为管理音乐而开发的库
基本结构如下
typedef struct song Song;
typedef struct snode SNode;
typedef struct artist Artist;
struct song
{
Artist* artist;
char* title;
int index;
int playtimes;
};
struct snode
{
struct snode* next, * prev;
Song* song;
};
struct artist
{
char* name;
struct artist* next;
SNode* head, * tail;
};
下面是我理解不了的部分
//首先这个代码定义了两个全局的数列,我想知道这两个数列里面具体都有什么
Artist* artist_directory[NUM_CHARS];
SNode* index_directory[SIZE_INDEX_TABLE];
int num_index = 0;
Artist* add_artist(char* name)
{
// 已经用函数生成Artist了
Artist* ptr_artist = create_artist_instance(name); // create_artist_instance:初始化新的artist并返回
Artist* p = artist_directory[(unsigned char)name[0]]; // 这一句我不能理解,为什么用artist_directory[(unsigned char)name[0]]
// name[0]代表首字母但是为什么要用unsigned char,char型当index的意义是什么
Artist* q = NULL; // 在链表中跟随p,并记住p的位置
while (p != NULL && strcmp(p->name, name) < 0) // 主要list中,到比p小的值出现为止(为什么要这样,有特别原因吗?)
{ // 是不是将作者名字按照首字母大小排序
q = p;
p = p->next;
}
if (p == NULL && q == NULL) // 空list,也就是可以直接使用的点
{
artist_directory[(unsigned char)name[0]] = ptr_artist;
}
else if (q == NULL) // p在最前面的位置
{
ptr_artist->next = artist_directory[(unsigned char)name[0]]; //又出现这个
artist_directory[(unsigned char)name[0]] = ptr_artist;
}
else
{
ptr_artist->next = p;
q->next = ptr_artist;
}
return ptr_artist;
}