欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 幼教 > 链表的基本操作(FreeRTOS基础)

链表的基本操作(FreeRTOS基础)

2024/10/23 23:32:54 来源:https://blog.csdn.net/qq_45956475/article/details/143117434  浏览:    关键词:链表的基本操作(FreeRTOS基础)
  1. 尾节点的插入操作

这里面只是记录了一下地址 没有分配空间,记录的是节点的首地址

  1. 链表根节点初始化
void vListInitialise( List_t * const pxList )  
{  /* 将链表索引指针指向最后一个节点 */  pxList->pxIndex = ( ListItem_t * ) &( pxList->xListEnd );  /* 将链表最后一个节点的辅助排序的值设置为最大,确保该节点就是链表的最后节点 */  pxList->xListEnd.xItemValue = portMAX_DELAY;  /* 将最后一个节点的 pxNext 和 pxPrevious 指针均指向节点自身,表示链表为空 */  pxList->xListEnd.pxNext = ( ListItem_t * ) &( pxList->xListEnd );  pxList->xListEnd.pxPrevious = ( ListItem_t * ) &( pxList->xListEnd );  /* 初始化链表节点计数器的值为 0,表示链表为空 */  pxList->uxNumberOfItems = ( UBaseType_t ) 0U;  
}

  1. 升序插入节点
void vListInsert( List_t * const pxList, ListItem_t * const pxNewListItem )  
{  ListItem_t *pxIterator;  /* 获取节点的排序辅助值 */  const TickType_t xValueOfInsertion = pxNewListItem->xItemValue;  /* 寻找节点要插入的位置 */  if ( xValueOfInsertion == portMAX_DELAY ){  pxIterator = pxList->xListEnd.pxPrevious;  }  else{  for ( pxIterator = ( ListItem_t * ) &( pxList->xListEnd );  pxIterator->pxNext->xItemValue <= xValueOfInsertion;  pxIterator = pxIterator->pxNext ){  /* 没有事情可做,不断迭代只为了找到节点要插入的位置 */  }  }  /* 根据升序排列,将节点插入 */  pxNewListItem->pxNext = pxIterator->pxNext;  pxNewListItem->pxNext->pxPrevious = pxNewListItem;  pxNewListItem->pxPrevious = pxIterator;  pxIterator->pxNext = pxNewListItem;  /* 记住该节点所在的链表 */  pxNewListItem->pvContainer = ( void * ) pxList;  /* 链表节点计数器++ */  ( pxList->uxNumberOfItems )++;  
}

  1. 从链表中删除节点
UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove )  
{  /* 获取节点所在的链表 */  List_t * const pxList = ( List_t * ) pxItemToRemove->pvContainer;  /* 将指定的节点从链表删除 */  pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious;  pxItemToRemove->pxPrevious->pxNext = pxItemToRemove->pxNext;  /* 调整链表的节点索引指针 */  if ( pxList->pxIndex == pxItemToRemove )  {  pxList->pxIndex = pxItemToRemove->pxPrevious;  }  /* 初始化该节点所在的链表为空,表示节点还没有插入任何链表 */  pxItemToRemove->pvContainer = NULL;  /* 链表节点计数器-- */  ( pxList->uxNumberOfItems )--;  /* 返回链表中剩余节点的个数 */  return pxList->uxNumberOfItems;  
}

没有把待删节点的内容空间删除

  1. ->和. 的区别
#include <stdio.h>
#include <stdlib.h>// 定义一个结构体
struct Person {char name[20];int age;
};int main() {
#if 0 // 使用点号(.)访问结构体成员struct Person person1;person1.age = 25;printf("Using dot operator: Age is %d\n", person1.age);// 使用箭头符号(->)访问结构体成员struct Person* person2 = (struct Person*)malloc(sizeof(struct Person));person2->age = 30;printf("Using arrow operator: Age is %d\n", person2->age);
#endifstruct Person p1;    //p表示类型为结构体Person 的变量struct Person p2;struct Person* pp = &p2;//pp表示 指针变量(Person*),存储的是p2的地址p1.age = 10;struct Person* p11;p11 = &p1;p11->age = 20;printf("p1's value = %d\n\r", p1.age);pp->age = 10;//pp->age = 10;//(*pp)->age = 20;//*pp.age = 20;//(*pp).age = 20;printf("p2's value = %d\n\r", p2.age);system("pause");return 0;
}

struct Person person2 = (struct Person)malloc(sizeof(struct Person));
**结构体指针需要分配地址空间!!!

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com