单链表由一个个的节点组成,节点由两个部分组成:数据域和指针域。
数据域就是存储这个节点的数据,这没什么说的。指针域存放的指针指向的是下一个结点,正是因为指针域的存在,把存在内存不连续区域里的各个结点连接了起来。
单链表最后一个结点的指针域为空NULL。
头结点与头指针的异同:
头结点放在第一元素的结点之前,数据域一般无意义或者存放链表的长度,头结点不要求必须存在。
头指针是链表指向第一个结点的指针,若链表有头结点则指向头结点,无论链表是否为空,头指针均不为空而且头指针是链表的必要元素。
单链表结点的定义
typedef struct node
{
int num; //数据域
struct node *next; //指针域
}NODE;
每个结点其实就是一个结构体。
单链表的插入
头插法:
p -> next = L -> next; //p是要插入的结点,L是被插入的结点之前的结点。
L -> next = p;
用头插法插入数据,读取数据是逆序的。
尾插法:
for()
{
r -> next = p; //p是要插入的结点,r是原来的结点
r = p;
}
r -> next = NULL;
单链表遍历
if(p != NULL)
{
p = p -> next;
}
单链表删除
q = p ->next; // q是要删除的结点
p -> next = p -> next -> next;
free(q); //释放q占用的空间