双向链表就是链表方向是双方向的,也就是双向链表中的每一个节点有两个指针,一个指针用来指向上一个节点(前驱),另一个指针用指向下一个节点(后继)。
本文主要是对双向链表的基本操作,主要包括双向链表的创建,插入节点,删除节点,还有输出节点的数据等。
结点的构造
typedef struct node
{
int data;
struct node *prev;
struct node *next;
}Node,*pNode;
基本操作
双向链表的创建
双向链表的创建同样像单链表一样可以有两种方法:头插法和尾插法。
使用尾插法创建双向链表:
算法思想:
先定义一个指针pnext指向头结点
1.新结点q的next指针域置空;
2.pnext结点的next指向q
3.新结点q的前驱指向结点pnext;
4.pnext标记结点q
head = (Node*)malloc(sizeof(Node));
head->next = NULL;
head->prev = NULL;
pnext = head;
q = (Node*)malloc(sizeof(Node));
q->next = NULL;
pnext->next = q;
q->prev = pnext;
pnext = q;
使用头插法创建双向链表:
算法思想:
q->next = head->next;
head->next = q;
head->next->prev = q;
q->prev = head;
双向链表的插入
插入时仅仅指出直接前驱结点,钩链时必须注意先后次序是:“先右后左”
算法思想:
q = (Node*)malloc(sizeof(Node));
q->next = pnext->next;
pnext->next = q;
pnext->next->prev = q;
q->prev = pnext;
插入时同时指出直接前驱结点p和直接后继结点q。
算法思想:
n= (Node*)malloc(sizeof(Node));
n->next = q;
p->next = n;
n->prev = p;
q->prev = n;
</