头都大了了 2022-06-02 00:21 采纳率: 85.7%
浏览 60
已结题

【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条回答 默认 最新

  • 笨小孩要多学习 2022-06-02 09:54
    关注
    
    Artist* artist_directory[NUM_CHARS];
    SNode* index_directory[SIZE_INDEX_TABLE];
    

    artist_directory、index_directory这两个是指针数组,把他们当做数组来看待就行了,只是数组里面存放的元素有点特殊,不是一个值,而分别是指向Artist、SNode的指针,而Artist、SNode都是双向链表链表结构,从

    typedef struct song Song;
    typedef struct snode SNode;
    typedef struct artist Artist;
    
    

    可以看出。
    结合变量的命名,也就可以看出artist_directory是一个存放Artist*指针的数组,数组的长度是NUM_CHARS,应该是首字符的总数,可能是ASCII码的长度,数组里面的元素分别存放着以A-Z开头的Artist链表指针,其中的链表指针分别指向name中某个字符开头的链表,这条链表里面存放的均是name以该字符为首的artist。
    例如:
    artist_directory[65] 即指向一条由所有name的首字符都是A开头的artist组成的链表。

    img

    根据前面的解析应该就不难理解下面这行了

     Artist* p = artist_directory[(unsigned char)name[0]];
    
    

    至于

    while (p != NULL && strcmp(p->name, name) < 0)
    
    

    这个为什么要找到比的name的值刚好要小的p,首先可以看到这个函数的接口为add_artist,即向artist链表插入一个新的artist,结合前面分析,在前面已经找到了以name首字符的链表,这里再从找到的链表中找到比的name的值刚好要小的p,说明这要实现的功能是在链表中要按name的大小进行排序,name小的在链表前面,name大的在链表后面,方便后续查找。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 6月14日
  • 已采纳回答 6月6日
  • 修改了问题 6月2日
  • 创建了问题 6月2日

悬赏问题

  • ¥15 使用ESP8266连接阿里云出现问题
  • ¥15 BP神经网络控制倒立摆
  • ¥20 要这个数学建模编程的代码 并且能完整允许出来结果 完整的过程和数据的结果
  • ¥15 html5+css和javascript有人可以帮吗?图片要怎么插入代码里面啊
  • ¥30 Unity接入微信SDK 无法开启摄像头
  • ¥20 有偿 写代码 要用特定的软件anaconda 里的jvpyter 用python3写
  • ¥20 cad图纸,chx-3六轴码垛机器人
  • ¥15 移动摄像头专网需要解vlan
  • ¥20 access多表提取相同字段数据并合并
  • ¥20 基于MSP430f5529的MPU6050驱动,求出欧拉角