1 定义:
双向链表在单链表的每个结点里增加一个指向其前驱的指针域prior,这样形成的链表中就有两条方向不同的链,称之为双向链表;
示意图:
双向链表可以很容易找到某一个元素的前驱结点;
2 结构定义:
typedef struct DNode
{
ElemType data;
struct DNode *prior, *next;
}DNode, *DoubleList;
3 双向链表前插操作:
(1)设指针p指向需要插入位置的后一个结点;s指向新结点;
(2)p->pre->next = s; s->pre=p->pre;
p->pre=s;s->next=p;
其中每一行的两个表达式可以反过来,但是第一行和第二行不能交换,不然会断链;
(3) 具体算法实现如下图所示:
4 双向链表的删除操作:
p->pre->next = p->next;
p->next->pre=p->pre;
free(p);
5 顺序存储的优缺点:
(1) 优点:用数组存储数据元素,操作方法简单,容易实现;
无需为表示结点间的逻辑关系而增加额外的存储开销;
存储密度高;
顺序表可按元素位序随机存取结点;
(2)缺点: 做插入、删除操作时,需大量地移动数据元素,效率比较低;
要占用连续的存储空间,存储分配只能预先进行,如果估量过大,可能导致后部大量空间闲置,如果预先分配过 小,又会造成数据溢出。