(六)双链表的结构和插入节点

(六)双链表的结构和插入节点

双链表结构双链表算法之插入节点(尾部插入)双链表算法之插入节点(头部插入)

双链表结构

  双链表并不是有两个链表,而是有两个遍历方向的链表,因此我们说的双链表其实是双向链表的简称。

  • 单链表节点 = 有效数据 + 指针(指向下一个节点)
  • 双链表节点 = 有效数据 + 两个指针(分别指向前一节点和后一节点)
 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}
posted @ 2019-01-10 20:36  天星小苑  阅读(733)  评论(0编辑  收藏  举报