本帖最后由 阿松松 于 2015-1-9 15:29 编辑 , \0 R2 w" N- {0 Q) F
" B# d4 P2 }1 [( g在list.c中,把一个结点插入到链表尾部 \3 f9 Q0 c; O! ?, s1 x
void vListInsertEnd( xList *pxList, xListItem *pxNewListItem )5 C: f0 d* i+ z$ t- }
/ C2 h7 [8 W6 D
1 x6 z" e- S+ m F& z; u9 b9 O6 Q
- void vListInsertEnd( xList *pxList, xListItem *pxNewListItem )8 }+ K- i8 Y0 x/ _
- {
: r4 F# ^4 s+ d$ o - volatile xListItem * pxIndex;
8 i" _- ^; J( [/ D - 2 e/ k4 m q% V; X9 ~
- /* 链表中,总是访问由PxIndex指向的链表结点。插入新结点到链表中时,
% M5 p$ w: P0 j' D2 ?! T - 使得在调用pvListGetOwnerOfNextEntry函数时,新插入的结点是最后一个被移除的,/ D' `3 [* o$ r4 Q1 \
- 而不是对链表排序(说实话官方的这句! U r% q. @: H5 \4 l0 q* `
- Insert a new list item into pxList, but rather than sort the list, U1 }0 t/ l! s
- makes the new list item the last item to be removed by a call to
& A0 G3 i2 V' Z - pvListGetOwnerOfNextEntry. 我一直搞不懂)。
' c# e6 I# ?% W# b9 B5 \2 I - 这意味着pxIndex必须指向这个新插入的结点。 */
. Z$ @' j) y9 l$ Q0 O% @: }1 U - pxIndex = pxList->pxIndex;7 m8 h: {! o9 T# B# |
" u- r+ q* n( c& Z- /*以下两句为新插入结点指定前后结点,可以比喻为孩子找到了爹妈。*/
' x G' b& F8 P( u8 h! T
, `+ N9 B7 r5 @9 }- I1 S- /*使得新插入的结点的下一个结点指向当前链表pxList中的pxIndex的下一个结点。*/) ]0 }, p' u% g2 h
- pxNewListItem->pxNext = pxIndex->pxNext;
! K* n3 o2 S2 L: o# L - * R- X1 |$ J( ]5 \3 f' j% J& e( M
- /*使得新插入的结点的上一个结点指向当前链表pxList中的pxIndex。*/
. k0 c% J; [( Q - pxNewListItem->pxPrevious = pxList->pxIndex;; S7 L6 E L4 S. Z
- , S- H1 c% a% F& L8 L6 ^: q
- /*以下两句使得当前链表认得新插入的结点,即爹妈要认识这是自己的孩子。1 X/ t; }" \6 r( y
- 即当前链表的pxNext以及pxPrevious都指向新插入结点(因为当前链表只有这! d' q* R* T3 T6 n( \
- 一个结点,除了xListEnd)。*// z0 R, p) t& q, \& o: z
0 p( M" U: s7 B+ c- /*使得当前链表pxList中的pxIndex的上一个的下一个(醉了,不知道为什么要
# E1 z: I/ p' ~- Q - 这样指来指去,最后还是指到了pxIndex,不还是自己嘛,汗。)指向新插入的结点。*/
. i9 Y" f% l* @3 V" {# y# E7 ?, j - pxIndex->pxNext->pxPrevious = ( volatile xListItem * ) pxNewListItem;4 d& b( S& Q$ _5 _. [ O: P
- + C& M4 `% S @
- /*使得当前链表pxList中的pxIndex的下一个(pxNext)指向新插入的结点。*/+ T. g& q, H! V6 }0 v7 e1 J8 C
- pxIndex->pxNext = ( volatile xListItem * ) pxNewListItem;. Y ]& i) Z, N' A
9 B# o7 Z" G8 r9 b% ^- /*使得当前链表pxList中的pxIndex指向新插入的结点。*/
8 r R# I8 T* `5 P D. Y- C - pxList->pxIndex = ( volatile xListItem * ) pxNewListItem;/ i/ R: r4 l- K0 Q+ |' z
- 7 J$ P6 i# s; `5 C" B9 D
- /* 让pxList知道这是他的结点。 */
# V$ p0 T0 m" p+ ^- @* q" o$ A+ j - pxNewListItem->pvContainer = ( void * ) pxList;
# Z, m7 i3 A! w
0 a6 k N6 m: s- /*链表结点的数量自加1*/
$ c/ @ I5 l$ E - ( pxList->uxNumberOfItems )++;
9 M, C p; u8 X7 | y+ F - }
复制代码 指针指来指去的,想想也头大,等下画个图。8 l; L/ w1 {' H) b9 Y
9 T! K; t$ n+ E, R$ a5 ], Y( d0 M
|
" G' I& y. N* f
代码中28行的分析错误二得很,今天看这些代码有新的理解,这样才是正确的。
" Z2 Q6 T$ H0 y2 T: E, H4 @
这句代码讲的是:$ B$ N. I; b+ x. Y+ E
使得当前链表pxList中的pxIndex指针中的pxNext指针中的pxIndex指针指向新插入的结点pxNexListIetm,这样解释有点儿罗嗦,简而言之,就是将pxList中pxIndex指向的下一个结点的指向规则不再指向以前的旧结点,而是指向新插入的结点pxNexListIetm6 }% y" ^7 h) q8 f, k# P3 G
) x* D( y8 o g; V: \- M/ S" J
下面讲的也是扯淡了,勿喷。。。
J C' f/ N1 w' X9 Y
引用一个大神讲的,看完这个思路才清晰( u) J. z6 H% z" n# D7 x& b
也没想到,插图倒是正确的了,尴尬5 S1 s/ ~% K$ h: b