你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

FreeRTOS源代码分析vListInsertEnd( xList *pxList, xListItem *pxNewL...

[复制链接]
阿松松 发布时间:2015-1-8 13:25
本帖最后由 阿松松 于 2015-1-9 15:29 编辑

在list.c中,把一个结点插入到链表尾部
void vListInsertEnd( xList *pxList, xListItem *pxNewListItem )


  1. void vListInsertEnd( xList *pxList, xListItem *pxNewListItem )
  2. {
  3. volatile xListItem * pxIndex;

  4. /* 链表中,总是访问由PxIndex指向的链表结点。插入新结点到链表中时,
  5. 使得在调用pvListGetOwnerOfNextEntry函数时,新插入的结点是最后一个被移除的,
  6. 而不是对链表排序(说实话官方的这句
  7. Insert a new list item into pxList, but rather than sort the list,
  8. makes the new list item the last item to be removed by a call to
  9. pvListGetOwnerOfNextEntry. 我一直搞不懂)。
  10. 这意味着pxIndex必须指向这个新插入的结点。 */
  11. pxIndex = pxList->pxIndex;

  12. /*以下两句为新插入结点指定前后结点,可以比喻为孩子找到了爹妈。*/

  13. /*使得新插入的结点的下一个结点指向当前链表pxList中的pxIndex的下一个结点。*/
  14. pxNewListItem->pxNext = pxIndex->pxNext;

  15. /*使得新插入的结点的上一个结点指向当前链表pxList中的pxIndex。*/
  16. pxNewListItem->pxPrevious = pxList->pxIndex;

  17. /*以下两句使得当前链表认得新插入的结点,即爹妈要认识这是自己的孩子。
  18. 即当前链表的pxNext以及pxPrevious都指向新插入结点(因为当前链表只有这
  19. 一个结点,除了xListEnd)。*/

  20. /*使得当前链表pxList中的pxIndex的上一个的下一个(醉了,不知道为什么要
  21. 这样指来指去,最后还是指到了pxIndex,不还是自己嘛,汗。)指向新插入的结点。*/
  22. pxIndex->pxNext->pxPrevious = ( volatile xListItem * ) pxNewListItem;

  23. /*使得当前链表pxList中的pxIndex的下一个(pxNext)指向新插入的结点。*/
  24. pxIndex->pxNext = ( volatile xListItem * ) pxNewListItem;

  25. /*使得当前链表pxList中的pxIndex指向新插入的结点。*/
  26. pxList->pxIndex = ( volatile xListItem * ) pxNewListItem;

  27. /* 让pxList知道这是他的结点。 */
  28. pxNewListItem->pvContainer = ( void * ) pxList;

  29. /*链表结点的数量自加1*/
  30. ( pxList->uxNumberOfItems )++;
  31. }
复制代码
指针指来指去的,想想也头大,等下画个图。

收藏 2 评论3 发布时间:2015-1-8 13:25

举报

3个回答
阿松松 回答时间:2015-1-8 13:50:43
随便画了下,请大神指点。
MediaLib_Camera Roll_WP_20150108_001.jpg
阿松松 回答时间:2015-1-9 15:27:13
本帖最后由 阿松松 于 2015-1-9 15:52 编辑
  1. /*使得当前链表pxList中的pxIndex的上一个的下一个(醉了,不知道为什么要
  2. 这样指来指去,最后还是指到了pxIndex,不还是自己嘛,汗。)指向新插入的元素。*/
  3. pxIndex->pxNext->pxPrevious = ( volatile xListItem * ) pxNewListItem;
复制代码


代码中28行的分析错误二得很,今天看这些代码有新的理解,这样才是正确的。

这句代码讲的是:
使得当前链表pxList中的pxIndex指针中的pxNext指针中的pxIndex指针指向新插入的结点pxNexListIetm,这样解释有点儿罗嗦,简而言之,就是将pxList中pxIndex指向的下一个结点的指向规则不再指向以前的旧结点,而是指向新插入的结点pxNexListIetm

下面讲的也是扯淡了,勿喷。。。
/*以下两句使得当前链表认得新插入的结点,即爹妈要认识这是自己的孩子。
即当前链表的pxNext以及pxPrevious都指向新插入结点(因为当前链表只有这
一个结点,除了xListEnd)。*/


阿松松 回答时间:2015-1-9 15:31:30
本帖最后由 阿松松 于 2015-1-9 15:44 编辑

引用一个大神讲的,看完这个思路才清晰
vListInsertEnd 函数将节点插入到链表的最后。所谓的最后,其实就是让  pxList->pxIndex 指向它就行了,因为遍历时是从 pxIndex->pxNext 的开始的,遍历一圈之后最后才能到 pxIndex。
故而插入后,pxIndex->pxNext还是指向以前的结点,那pxIndex就指向了新插入的结点,新插入的结点理所当然的排在了链表的最后。
也没想到,插图倒是正确的了,尴尬

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版