嵌入式双向链表理解

给自己复习用的

#include <stdio.h>
#include <string.h>

/*
  定义一个节点结构体,三个成员分别是节点数据、指向上一个节点的struct LIST_NODE指针、指向下一个节点的struct LIST_NODE指针
*/
typedef struct LIST_NODE
{
  int data;
  struct LIST_NODE *pxNext;
  struct LIST_NODE *pxPrevious;
}ListNode;

/*
  定义一个链表结构体,两个成员分别是根节点RootNode(以ListNode结构体形式存在,有自己的成员)、以及链表节点数量
*/
typedef struct LIST
{
  unsigned int NumberOfNodes;
  ListNode RootNode;
}List;


/*
  节点初始化,使用步骤:
  1.全局定义一个节点结构体
  2.传入参数为节点结构体指针,表示你准备向该节点传入参数
  3.传入data值
*/
void ListInitialiseItem(ListNode *pxListNode, int value)
{
  pxListNode->data = value;
}

/*
  链表初始化,使用步骤:
  1.全局定义一个链表结构体
  2.传入参数为链表结构体指针,表示你准备初始化该链表
  3.为链表结构体传入参数
    (1)为根节点结构体赋值
        a)RootNode.data:  不需要为data赋值,此时data为随机值,但因为没有函数会访问他的data值,所以无所谓
        b)RootNode.pxNext:  根节点的下一个节点结构体指针。因为链表只有一个节点,就是根节点,所以他的前后都是他自己。传入参数为结构体指针,所以就是&(pxList->RootNode),记得要取址
        c)RootNode.pxPrevious:  根节点的下一个节点结构体指针。因为链表只有一个节点,就是根节点,所以他的前后都是他自己。传入参数为结构体指针,所以就是&(pxList->RootNode),记得要取址
    (2)确定链表初始化时候的节点数量————也就是一个,就是根节点
*/
void ListInitialise(List *pxList)
{
  pxList->RootNode.pxNext = &(pxList->RootNode);
  pxList->RootNode.pxPrevious = &(pxList->RootNode);
  pxList->NumberOfNodes = 1;
}

/*
  插入新节点
*/
void ListInsertEnd(List *pxList, ListNode *pxInsertListNode)
{
  /*
  新建两个ListNode节点结构体指针,用来方便给新旧成员结构体中的Next和Previous指针赋值
  这两个指针是抽象的,用来传递值的,赋予了名字叫NextNode和PreviousNode,只用来传递数
  */
  ListNode *pxNextNode = &(pxList->RootNode);                      
	ListNode *pxPreviosNode = pxList->RootNode.pxPrevious;

  /*
  这两个指针能帮助我们更好的插入节点
  开始处理新插入节点*pxInsertListNode,这时候我们给他传递值
  1. 插入节点的下一个值,就是pxNextNode,也就是指向根节点
  2. 插入节点的上一个值,就是pxPreivousNode,指向根节点的上一个成员
  */
  pxInsertListNode->pxNext = pxNextNode;
  pxInsertListNode->pxPrevious = pxPreviosNode;

  /*
  上面通过赋值,我们安排了:
  1.插入值pxInsertNode的下一个成员,是pxNextNode
  2.插入值pxInsertNode的上一个成员,是pxPreviousNode

  为了链接起来,我们必须告知:
  1.pxNextNode的上一个成员就是pxInsertNode
  2.pxPreviousNode的下一个成员就是pxInsertNode
  */
  pxPreviosNode->pxNext = pxInsertListNode;                  /*前结点指向插入结点*/   
  pxNextNode->pxPrevious = pxInsertListNode;                 /*后结点指向插入结点*/   

  /*
  最后链表节点数量+1
  */
  pxList->NumberOfNodes++;
}




/*
  删除新节点
*/
void ListRemove(List *pxList, ListNode *pxIListToRemove)
{
  ListNode *pxPreviosNode = pxIListToRemove->pxPrevious;     /*删除结点的前结点*/
  ListNode *pxNextNode = pxIListToRemove->pxNext;            /*删除结点的后结点*/
	
  pxNextNode->pxPrevious = pxPreviosNode;                    /*后结点指向前结点*/
  pxPreviosNode->pxNext = pxNextNode;                        /*前结点指向后结点*/

  (pxList->NumberOfNodes)--;                                 /*链表结点计数减1*/
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值