双向链表也叫双链表,是链表的一种。
双向链表是一种常用的数据结构,允许在O(1)时间内对链表的头尾进行元素的添加和删除操作,同时也支持双向遍历。
结构特点:
双向链表的每个节点包含三个基本元素:前驱指针域、数据域和后继指针域。前驱指针域用于存放指向上一个节点的指针,数据域用于存储该节点的数据元素,后继指针域用于存放指向下一个节点的指针。
双向链表有一个附加的头结点,由链表的头指针指示。头结点的数据域可以不放数据,或者存放一个特殊要求的数据。头结点的前驱指针指向链表的尾结点,后继指针指向链表的首元结点。双向链表的首元结点的左链指针和尾结点的右链指针都指向附加的头结点。
操作特点:
插入和删除操作:双向链表支持在任意节点前后插入和删除节点,操作相对复杂,但时间复杂度仍为O(1)。
遍历操作:从双向链表中的任意一个节点开始,可以直接访问它的前驱节点和后继节点,从而进行双向遍历。
它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。因此,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般构造双向循环链表,即最后一个结点指向头结点,形成一个环,这样从循环链表中的任何一个结点出发都能找到任何其他结点。并且双向链表与单链表有显著区别。
双向链表和单向链表的主要区别体现在以下几个方面:
指针方向:单向链表的每个节点只有一个指向下一个节点的指针,而双向链表的每个节点则有两个指针,一个指向前一个节点,另一个指向下一个节点。
遍历方式:单向链表只能从头部开始遍历,而双向链表则可以从任意节点开始遍历,向前或向后都可以。
功能和效率:单向链表只能进行单向的插入和删除操作,效率相对较高。而双向链表虽然可以进行双向的插入和删除操作,但操作相对复杂,因此效率相对较低。
空间占用:由于双向链表每个节点需要额外的指针来存储前驱节点的信息,因此其空间占用通常会比单向链表大。
typedef struct DualNode
{
int data;
struct DualNode *prior;
struct DualNode *next;
}Dual,*Duli;
Status In(DuLi* L)
{
Dual *p, *q;
int i;
*L= (DuLi*)macllo(sizeof(Dual));
if(!(*L))
{
return error;
}
(*L)->next=(*L)->prior=NULL;
p=(*L);
for( i=0;i<26;i++)
{
q=(Dual*)malloc(sizeof(Dual));
if(!q)
{
return error;
}
q->data ='A'+i;
g->prior=p;
q->next= p->next;
p->next=q;
p=q;
}
//双向循环链表
p->next=(*L->next;
(*L)->next->prior=p;//
return OK;
}
int main()
{
Dual L;
int i,n;
In(&L);
scanf("%d",&n);
for(i=0;i<26;i++)
{
L=L->next;
printf("%d",l->data);
}
return 0;
}