头都大了了
2022-06-02 00:21
采纳率: 83.3%
浏览 56

【C语言】数据结构链表问题

看别人设计的数据结构代码时遇到一个问题,需要帮忙理解一下。
背景:这是一个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;
}

3条回答 默认 最新

相关推荐 更多相似问题