RTOS训练营C语言基础-链表

创建时间:2022/2/21 16:01
更新时间:2022/3/30 15:11
作者:gi51wa2j
标签:bingo, C, RTOS训练营, 细节知识

1. 使用数组和链表的区别

数组需要一大串连续的空间
链表需要把空闲的空间串联起来就好了

2. 链表分类

3. 双向循环链表的插入与删除

3.1 插入

3.2 删除

4. 代码实现

4.1 定义结点和链表

4.2 初始化结点和链表

注意:链表头,里面有2个数据,一个就是有多少个链表项,另外一个就是根节点,一开始的时候,根节点也是一个节点,自己指向自己。

4.3 插入结点ListNode


4.4 删除结点ListNode


4.4 汇总代码

/* lesson6:链表 */ /*------------------------1.链表和结点的定义----------------------------*/ /*结点结构体*/ typedef struct LIST_NODE { int data;                        /*用于存放结点数据*/ struct LIST_NODE *pxNext;        /*用于指向下一个结点*/ struct LIST_NODE *pxPrevious;    /*用于指向上一个结点*/ }ListNode; /*链表结构体*/ typedef struct LIST { unsigned int NumberOfNodes;      /*用于记录链表结点数量*/ ListNode RootNode;               /*用于作为循环链表的参考点*/ }List; /*------------------------2.链表和结点的初始化---------------------------*/ /*结点初始化*/ void ListInitialiseItem(ListNode *pxListNode, int value) {  pxListNode->data = value;       /*结点数据赋值*/ } /*链表初始化*/ void ListInitialise(List *pxList) { pxList->RootNode.pxNext = &(pxList->RootNode);     /*由于此时链表中没有结点,第一个结点指向自己*/ pxList->RootNode.pxPrevious = &(pxList->RootNode); /*由于此时链表中没有结点,第一个结点指向自己*/ pxList->NumberOfNodes = 1;                         /*链表结点计数初始化为1,也就是只有一个根结点*/     } /*------------------------3.1结点插入链表---------------------------*/ void ListInsertEnd(List *pxList, ListNode *pxInsertListNode) { ListNode *pxNextNode = &(pxList->RootNode);                /*插入结点的后结点*/ ListNode *pxPreviosNode = pxList->RootNode.pxPrevious;     /*插入结点的前结点*/     pxInsertListNode->pxNext = pxNextNode;                     /*插入结点指向后结点*/ pxInsertListNode->pxPrevious = pxPreviosNode;              /*插入结点指向前结点*/ pxPreviosNode->pxNext = pxInsertListNode;                  /*前结点指向插入结点*/       pxNextNode->pxPrevious = pxInsertListNode;                 /*后结点指向插入结点*/      (pxList->NumberOfNodes)++;                                  /*链表结点计数加1*/ } /*------------------------3.2链表删除结点---------------------------*/ void ListRemove(List *pxList, ListNode *pxIListToRemove) { ListNode *pxPreviosNode = pxIListToRemove->pxPrevious;     /*删除结点的前结点*/ ListNode *pxNextNode = pxIListToRemove->pxNext;            /*删除结点的后结点*/     pxNextNode->pxPrevious = pxPreviosNode;                    /*后结点指向前结点*/     pxPreviosNode->pxNext = pxNextNode;                        /*前结点指向后结点*/ (pxList->NumberOfNodes)--;                                 /*链表结点计数减1*/ } int main(void) { /*1.定义链表、结点*/ List      list;         //定义链表 ListNode  list_node1;   //定义结点1 ListNode  list_node2;   //定义结点2 /*2.初始化链表、结点*/ ListInitialise(&list); ListInitialiseItem(&list_node1, 100); ListInitialiseItem(&list_node2, 200); /*3.插入链表*/ ListInsertEnd(&list, &list_node1); ListInsertEnd(&list, &list_node2); /*4.删除结点*/ ListRemove(&list, &list_node1); return 0; }

5.课后问答