ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

嵌入式双向链表理解

2021-09-11 21:03:25  阅读:245  来源: 互联网

标签:结点 ListNode 嵌入式 链表 RootNode pxList 双向 节点


给自己复习用的

#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*/
}



标签:结点,ListNode,嵌入式,链表,RootNode,pxList,双向,节点
来源: https://blog.csdn.net/qq_40180744/article/details/120243152

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有