【C语言】数据结构,基本结构体设计问题

请问一以下这个结构应该怎么利用结构体以及指针完成呢?(可以提供一下注释吗,谢谢!)
补充一下,想使用二重链表来对音乐做一个排列,请问如何实现呢?

img

typedef struct _artist artist;
typedef struct _artist{
    char name[20];
}artist;
typedef struct _song song;
typedef struct _song{
    char name[30];
    char singer[30];
    song *a;
}song;
typedef struct _listNode *listPointer;
typedef struct _listNode{
    song data;
    listPointer link;
}ListNode;

我只做到这里,后面结构体之间的指针不知道该怎么弄

代码有些冗长,请见谅


#include <string>

struct Artist;
struct sNode;
struct Song;

//Artist 信息
struct Artist
{
    std::string name;    //名称
    Artist* next;        //下一个 artist
    Artist* head;        //首项 artist
    sNode* tail;        //对应 sNode

    //--构造函数
    //首项
    Artist(std::string name, sNode* tail)
        :
        name(name),
        tail(tail),
        head(this)
    {}
    //其余
    Artist(Artist* head, Artist* prev, std::string name, sNode* tail)
        :
        name(name),
        tail(tail),
        head(head)
    {
        prev->next = this;
    }
};


//Snode 信息
struct sNode
{
    sNode* next;    //下一个 sNode
    sNode* prev;    //上一个 sNode
    Song* song;    //对应 Song

    //--构造函数
    sNode(sNode* next, sNode* prev, Song* song)
        :
        next(next),
        prev(prev),
        song(song)
    {}
};


//Song 信息
struct Song
{
    Artist* artist;        //对应 Artist
    std::string    title;    //标题
    std::string path;    //文件路径
    int index;            //索引

    //--构造函数
    Song(Artist* artist, std::string title, std::string path, int index)
        :
        artist(artist),
        title(title),
        path(path),
        index(index)
    {}
};

供参考:

#include <stdio.h>
#include <stdlib.h>
struct _Artist;
typedef struct _Song {
    struct _Artist* artist;
    char title[64];
    char path[128];
    int  index;
}Song;
typedef struct _SNode {
    Song song;
    struct _SNode* next;
    struct _SNode* prev;
}SNode;
typedef struct _Artist {
    char name[64];
    struct _Artist* next;
    SNode* head;
    SNode* tail;
}Artist;

定义俩个列表
1、artist作为一个列表,每个节点表示一位歌手,每个节点里有一个成员指针,指向该歌手所有的song;
2、song定义一个列表,同一个artist下的歌组成一个指针,指针放在artist成员变量里

struct ArtistNode {
    string artist_name;
    SoneNode * songs;
    ArtistNode * next_artist;
};

struct SoneNode {
    string sone_name;
    SoneNode * next_song;
};

参照Linux内核链表实现