/* 返回压缩表zl的第index个结点,
index为非负:从表头开始查找,0表示返回第一个结点
index为负:从表尾开始查找,-1表示返回最后一个结点
*/
unsigned char *ziplistIndex(unsigned char *zl, int index) {
unsigned char *p; /* 保存目标结点地址 */
zlentry entry; /* 未对改变量进行初始化,考虑到该变量会被函数zipEntry返回值直接赋值,可以原谅未初始化 */
if (index < 0) {
/* 将索引转换为正数,因为负数索引从-1开始,所以转换为正数之后索引值-1,
保证索引为-1,通过计算获得索引是0,指向的是从表尾开始查找时的最后一个结点 */
index = (-index) - 1;
/* p指向表尾结点,即最后一个结点 */
p = ZIPLIST_ENTRY_TAIL(zl);
/* 如果压缩表不为空 */
if (p[0] != ZIP_END) {
entry = zipEntry(p); /* 只有列表不为空时,p才指向一个结点,才能获得p指向的结点信息entry */
/* 通过遍历index次获得指定索引的结点 */
/* prevrawlen:前置结点的长度 */
while (entry.prevrawlen > 0 && index--) {
p -= entry.prevrawlen;
entry = zipEntry(p);