✅*歌词信息结构体(链表)
typedef struct lylics{
uint time; //歌词对应的时间
char lrc[lrc_length]; //歌词
struct lylics *next; //下一句歌词
}LRC;
✅*歌词句柄(链表+指针数组)
typedef struct lylics_ptr
{LRC *lrc_head; //链表首地址
LRC **lrc_arry; //存放链表节点指针的指针数组
uint lrc_arry_size; //指针数组的大小
}LRC_PTR;
✅static char *open_lrc(char *addr):打开歌词文件,读数据到缓冲区
*参数: 歌词文件地址:addr
*返回值: 缓冲区首地址
✅static LRC *add_lrc_to_link(LRC *head, uint time, char *lrc):增加一个歌词信息节点至链表结尾,维护静态LRC temp减少索引次数
*参数: 链表的表头:LRC *head
歌词时间: uint time
歌词:char *lrc
*返回值: 链表的表头:head
✅void print_lrc_link(LRC_PTR lrc);遍历输出链表
*参数: 歌词句柄:lrc
*返回值: 无
✅static void get_dispose_line(char *lycris_buf, LRC_PTR *lrc);返回每一行歌词(不带换行符号'\n')
*参数: 缓冲区首地址:lycris_buf
歌词句柄:lrc
*返回值: 无
✅LRC *dispose_lrc(char *name, LRC_PTR *lrc);处理歌词文件
*参数: 歌词文件名 :name
歌词句柄:lrc
*返回值: 歌词信息结构体(链表)
歌词文件示例:
流程图:
函数中关键性操作:
dispose_lrc
get_dispose_line
lrc->lrc_head = dispose_line(line_ptr, lrc->lrc_head);
增加LRC链表歌词操作
static void inorder_link(LRC_PTR *lrc)
链表的元素按时间大小从小到大排序,排序方法是冒泡排序。
需要将链表转换为数组才能使用冒泡排序。
也就是存放链表节点指针的指针数组