链表是数据存储的一种方式,数据元素在存储器上的不同位置,通过(链指针)建立联系。
struct node_t //定义一个结构体来保存
{
int data; //数据域
struct node_t *next; //指针域,指向下一个节点
};
链表因为可以碎片化的占据存储器上的位置,所以最最常用。
链表插入数据和删除数据方便(下文详表),但是查找麻烦。
有头链表和无头链表
有头链表和无头链表是相对的概念。通常理解为,有头链表中第一个头节点的数据是无效的。
无头链表则是每个数据都是有效的。因此他们的遍历方式有所不同。
有头链表(遍历)
while(p->next != NULL)
{
p = p->next; //先将指针后移,空出头指针之后
printf("%c" , p->data) // 打印有效数据
}
无头链表(遍历)
while(p != NULL)
{
printf("%c" , p->data); //链表中的每一个数据都是有效数据,所以直接进行遍历
p = p->next;
}
单向链表和双向链表
顾名思义,单向链表的指向只有一个方向,一次向后指向。而双向链表既有指向前一个元素的指针,也有指向后一个元素的指针,所以称之为双向链表。
单向链表
struct node_t
{
int data;
truct node_t* next; //指针指向下一个节点
};
双向链表
struct node_t
{
int data; //数据域
struct node_t* next; //指向后一个节点的指针
struct node_t* pri; //指向前一个节点的指针
};