(六)双链表的结构和插入节点
双链表结构双链表算法之插入节点(尾部插入)双链表算法之插入节点(头部插入)
双链表结构
双链表并不是有两个链表,而是有两个遍历方向的链表,因此我们说的双链表其实是双向链表的简称。
- 单链表节点 = 有效数据 + 指针(指向下一个节点)
- 双链表节点 = 有效数据 + 两个指针(分别指向前一节点和后一节点)
1/*
2 *双链表节点
3 */
4struct node
5{
6 int data;
7 struct node *pPrev;
8 struct node *pNext;
9}
10struct node *create_node(int data)
11{
12 struct node *p = (struct node *)malloc(sizeof(struct node));
13 if(NULL == p)
14 {
15 printf("malloc error.\n");
16 return NULL;
17 }
18 p -> data = data;
19 p -pPrev = NULL;
20 p ->pNext = NULL;
21 return p;
22}
双链表算法之插入节点(尾部插入)
思路分析
- 遍历移动到链表的尾部节点;
- 将新节点连接到原来的尾部节点
- 新节点的pPrev指向前一节点
- 原尾部节点的pNext指向新节点
代码实现
1/*
2 *pH :头指针
3 *new : 新节点指针
4 */
5void insert_tail(struct node *pH,struct node *new)
6{
7 //第一步:找到链表尾节点
8 struct node *p = pH; //头节点指针
9 while(NULL != p -> pNext)
10 {
11 p = p -> pNext; //移动
12 }
13 //第二步:将新节点插入到原来的尾节点后面
14 p -> pNext = new;
15 new -> pPrev = p;
16}
双链表算法之插入节点(头部插入)
思路分析
- 新节点的pNext指向原来节点的第一个有效节点
- 节点1的pPrev指向新节点
- 头节点的pPrev指向新节点
- 新节点的pPrev指向头节点
代码实现
1/*
2 * pH : 指向头节点
3 * new : 新节点
4 */
5void insert_head(struct node *pH,struct node *new)
6{
7 new -> pNext = pH ->pNext ; //(1)新节点的pNext指向原来节点的第一个有效节点
8 if(NULL != pH -> pNext) //当链表只有一个头节点不处理
9 pH -> pNext -> pPrev = new; //(2)节点1的pPrev指针指向新节点的地址
10 pH -> pNext = new; //(3)头节点的pNext指向新节点的地址
11 new -> pPrev = pH; //(4)新节点的pPrev指向头节点
12}