嵌入式双向链表理解
作者:互联网
给自己复习用的
#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