1.单链表
在每个结点中除了包含数据域外,还包含一个指针域,用以指向后继结点。
1>带头结点的单链表中,头指针head指向头结点,头结点的值域不含任何信息,从头结点开始存储数据信息。头指针head始终不等于空,head->next 等于空时,链表为空。
2>不带头结点的单链表中的头指针head直接指向开始结点
区分:带头结点的单链表有一个结点不存储信息,不带头结点的单链表的所有结点都存储信息。
单链表结构体到底定义了什么
产生疑问的源头
struct list
{
int num;
list *next;
};
a:在用代码米哦啊书单链表之前,我们需要定义一个结构体来描述单链表的结点。
typedef struct Node
{
ElemType data;
struct Node *next ;
}Node;
typedef struct Node *LinkList;
1.假设p是指向线性表第i个元素的指针,则该结点ai的数据我们可以用p->date来表示 ,p->date的值是一个数据元素结点ai的指针域可以用p->next 来表示,p->的值是一个指针。p->next指向谁呢,当然是指向第i+1个元素了,机指向ai+1的指针。
2.关于结构体struct Node *next这一句代码,为什么要这么写,写成int *next 行不行,
不行,next是指向下一个Node,所以其类型必须是Node,int *next 只能指向int,而不能指向Node.
所以必须定义为Node,但是Node 是一个结构体,所以前面必须还要加上一个struct。
2.双链表
双链表就是在单链表结点上增添了一个指针域,指向当前链表的前驱,同样双链表也分为带头结点的双链表和不带头结点的双链表,类似于单链表。
3.循环单链表
将单链表的最后一个指针域(空指针)指向链表中第一个结点即可(这里之所以说第一个结点而不是头结点是因为,如果循环单链表是带头结点的,则最后一个指针域要指向头结点,要是不带头结那么就直接指向,第一个结点也成称为开始结点)。与单链表相比,循环单链表可以实现访问链表中的每一个结点。
4.循环双链表