background image
}
/* 向链表末尾增加新的数据 */
last_person->next = person;
/* 更新链表尾指针 */
last_person = person;
}
namelist *name_pop(void)
{
namelist *first_person = people;
if (people) {
people = people->next;
}
return first_person;
}
新的
namelist 结构可以从这个链表中多次插入或弹出, 而不用调整结构的大小或在某
些位置间块拷贝元素
.
前面你看到的链表只是一个单链表
, 虽然它有一些有趣的特性, 但它有致命的缺点. 给
出链表中一项的指针
, 将它从链中剪切出来并确保前面的元素正确的链接上下一个元素就
变得比较困难
.
为了知道它的前一个元素
, 就需要遍历整个链表直到找到一个元素的 next 指针指向要
被删除的元素
. 对于大的链表, 这可能需要可观的 CPU 时间. 一个简单的相对廉价的解决
方案是双链表
.
对于双链表而言
, 每个元素增加了一个指针元素, 它指向链表中的前一个元素:
typedef struct _namelist namelist;
struct {
namelist *next, *prev;
char *name;
} _namelist;
一个元素被添加到双链表的时候
, 这两个指针相应的都被更新:
void name_add(namelist *person)