双链表
单链表只有一个后继指针,所以只能从头节点依次向后遍历。要访问某个节点的前驱节点,只能从头开始遍历。访问后继节点时间复杂度为O(1),访问前驱节点为O(n)。
为了克服这个缺点,引入双链表。
1、双链表单个节点。
prior | data | next |
---|---|---|
prior为前驱指针域 | data为数据域 | next为后继指针域 |
节点类型描述如下:
typedef struct DNode{
ElemType data;
struct DNode *prior,*next;
}DNode,*LinkList;
2、双链表的基本操作
插入操作
s->next=p->next;
p->next->prior=s;
s->prior=p;
p->next=s;
//第1、2步必须在第4步之前
删除操作
p-next=q->next;
q-next-prior=p;
free(q);
循环链表
循环单链表
设尾指针操作效率更高
若L->next==L,链表为空。
循环双链表
若L->nextL&&L->priorL,链表为空。
静态链表
通过数组实现存储结构的单链表
考点,但是不常用
链表描述:
#define MaxSize 50
typedef struct{
ElemType data;
int next;
}SLinkList[MaxSize];