本帖最后由 阿松松 于 2015-1-9 23:35 编辑 3 l; \, ?5 n) j+ L# S& u1 f* T
3 B0 ?1 } ^; d3 m" v5 n
在list.c中,将结点按照升序插入到链表的合适的位置。
" j9 z) q- T" e嗯,升序,就是以xListEnd作为最大值且放在链表结尾的从小到大的一种排序方式。
$ z+ F8 Z6 p+ N7 j7 K5 A2 R0 g$ b4 p( [
vListInsert( xList *pxList, xListItem *pxNewListItem )
! Z1 u+ Z2 x* @" v
. l; V: Z' D9 b. k! z1 m2 W
$ D; q: Y8 C, z7 L/ e M7 H" S. z2 ]分析此段代码的时候,要记得这样的规则:2 X# r- b+ u. Z& X9 d, x: w9 x
遍历链表的时候,总是访问当前培训Index(本代码中是pxIterator)->Next指向的结点。
9 }0 ?! ~8 e( V) }' s而且,当访问到的结点与要插入的结点值大小相等的时候,是有一个特定的规则的,待补充。。。- void vListInsert( xList *pxList, xListItem *pxNewListItem ) 5 \# `- C; F5 g/ }0 [8 h( ^# e
- {
5 h4 x5 y/ S$ B2 y# ]/ P - /*新建一个指针变量,在for循环中作遍历链表用*/ 1 w: K) C7 q. c+ Y9 g3 _
- volatile xListItem *pxIterator;
j4 I0 }2 F6 _, n) x$ I0 K
4 R- ^. U7 t+ [' i: o h- /*新建变量,存储新插入结点的值,升序排列时比较用。
$ H, i* E7 x9 D( I# d: E( Z - 嗯,这个值应该用来存储包含该结点任务的延时时间?*/
' k" N3 p( K: m# G9 c! k+ F5 N - portTickType xValueOfInsertion;
0 P, l6 e! f; d) _
! S, ?8 D' g- Q! }; R9 N- /*新建变量,存储新插入结点的值,升序排列时比较用.*/ ) b8 X% k& |1 k0 J+ P
- xValueOfInsertion = pxNewListItem->xItemValue;
0 k! k1 }: y& m# U! x
. ?2 E0 C- Q* |; T3 U+ }0 a ^( t- /*portMAX_DELAY是链表中能存储的最大的延时时常,也就是xListEnd变量的值,这个变量的使用有待分析。- }: d( C: a6 t8 e/ F+ X
- 如果新插入的结点的值等于这个最大值,那么直接把新插入的结点放到xListEnd前面就ok了*/
; X& [+ u' G5 ~" o. l8 h1 E - if( xValueOfInsertion == portMAX_DELAY )
Q3 f3 J, @& J. t - {
/ D2 M5 f: w& x; |4 \* h4 c6 h - /*这句话也说明了,xListEnd上面的那个结点的值是最大的,即升序排列方式。*/
! T& z+ V% R9 D - pxIterator = pxList->xListEnd.pxPrevious;
+ V. s" f' v& b" P - } 1 T/ `3 A, `3 \" N' g
- else 8 R6 f& N; Q1 ]: G: ?. H; Q% p
- {
7 Y5 i' k+ n! J# L8 J" z3 f" |: R - /*否则的话,就要从最xListEnd后面的那个结点开始进行遍历,! n; C' P7 G# o3 ~! a- K
- 把链表中的每个结点的值和新插入的结点值对比。*/! |" Y5 O% }0 n5 i; c: A
+ `# [- q- {+ A. k- /*如果新插入的结点的值大于链表中pxIterator指针的后一个结点的值(链表中当前遍历到的结点)的值,则表明还没有找到合适的位置,就会一直在for循环中遍历,如果在某一次循环中发现遍历的那个值比新插入的结点的值大,(即pxIterator->pxNext->xItemValue <= xValueOfInsertion),且此时必满足pxIterator->xItemValue > xValueOfInsertion(因为既然遍历到了pxNext,那么pxNext的上一个结点即pxIterator指向的值肯定不满足条件),那么此时跳出for循环。*/
0 i0 o& w/ a% [ - for( pxIterator = ( xListItem * ) &( pxList->xListEnd ); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext );
' r4 m X4 _! Y6 s: x% i/ i - }
% d& d- K( b" e) o2 b$ N$ q9 a( g
2 N; b8 f$ C- |1 w( X/ X- /*在将新结点插入到链表中时,要连接好新结点与上下结点直接的关系,及双向链表的pxNext指针与pxPrevious指针,7 s# n: k. o, e% [# g. G
- 即:2 g- {8 l# J: Z
- pxNewListItem->pxNext指向下一个元素(与下一个结点之间的关系)& K* L4 c# k1 \
- pxNewListItem->pxNex->pxPrevioust指向pxNewListItem(与下一个结点之间的关系)
& W% C' h! R$ j7 \% R
" q: D9 a% i% Y- G2 b* _- pxNewListItem->pxPrevious 指向上一个元素(与上一个结点之间的关系)
$ w( `& `" A' J( } - pxNewListItem->pxPrevious ->pxNext指向pxNewListItem(与上一个结点之间的关系)2 d5 S" a( u, r9 `( D( k/ G
( ?0 Z+ q% y; z5 e8 m- 根据这几点规则,以下的几行代码就不用作分析了,请自行脑补。*/
- t: o8 _0 R7 `% [1 W
F% l4 F& K3 B8 h: W. B4 D9 k! g
7 b5 l3 q7 N# q( k) ~7 r. e# s! \- pxNewListItem->pxNext = pxIterator->pxNext; 1 B6 v0 b* b3 |
- pxNewListItem->pxNext->pxPrevious = ( volatile xListItem * ) pxNewListItem;
1 C* |4 _$ F9 F$ |% t( J - pxNewListItem->pxPrevious = pxIterator;
$ `* r- u+ p s% d2 q - pxIterator->pxNext = ( volatile xListItem * ) pxNewListItem; 7 G) w; }. X% s- T; J9 @
- 0 Y, G$ g9 ?+ a# ^$ J" u
- /*表明自己已经成功的插入到pxList链表中*/
& I0 ], r; C, ]% [! ^1 b7 z/ `+ K - pxNewListItem->pvContainer = ( void * ) pxList; & B; t3 y. f0 R8 x, _3 `( x1 p
- /*链表中的结点数量自加1*/
# C$ F2 j$ q3 U; W3 U" @; { - ( pxList->uxNumberOfItems )++; * y3 c4 Z* n, t, P7 n8 ^" }
- }
复制代码 . u' `8 n, b6 r5 H* r* x% u3 P
. k; p& O* t1 |9 E8 H( Z$ n没分析完,出去透气,等下来补。。嗯,我又回来更新了,终于完成了,请拍砖。
; F0 K- q# e4 t7 ] d
( a6 Q9 u) t; N F) n- V/ [/ Z3 ^; @3 u+ N1 S& D* G7 o
{) N" I3 k0 F5 u
+ N1 N0 x4 O( ^7 \% z5 T# X# i+ w) C
$ y }# u' |* p4 O |