本帖最后由 阿松松 于 2015-1-9 15:29 编辑 . R- c7 L" k0 [3 C Q) e5 r- ^6 V( C2 B
7 L6 D8 U2 S! E5 N在list.c中,把一个结点插入到链表尾部
2 n e7 u" b) f1 h6 P' Wvoid vListInsertEnd( xList *pxList, xListItem *pxNewListItem )
2 W+ p0 V8 b9 |9 `4 G G, w% K l4 x
0 ~! |, w5 C# ^" {. ?
- void vListInsertEnd( xList *pxList, xListItem *pxNewListItem )
; P2 z( @3 d N V. @2 \7 V( G0 m6 B - {) f! ~' L& v: X) V$ T1 O0 r1 ?
- volatile xListItem * pxIndex;6 o% F) {0 j5 E3 f
5 v c6 K, x" D- /* 链表中,总是访问由PxIndex指向的链表结点。插入新结点到链表中时,' j4 [8 I* g7 h5 R3 U" o* y1 m
- 使得在调用pvListGetOwnerOfNextEntry函数时,新插入的结点是最后一个被移除的,
$ x5 W4 `0 C# a' i* j) U( y+ Y4 {1 C y - 而不是对链表排序(说实话官方的这句- A! w' ]/ g: ^ Z1 k: s
- Insert a new list item into pxList, but rather than sort the list,
/ A4 D7 G3 k* Y2 q2 {8 G7 ~5 o - makes the new list item the last item to be removed by a call to# p% }5 m- l% h& {7 s% a
- pvListGetOwnerOfNextEntry. 我一直搞不懂)。
- X# `8 A+ D3 s+ @$ a' q5 ^ - 这意味着pxIndex必须指向这个新插入的结点。 */ ?6 r. P6 B. v" L& z& u
- pxIndex = pxList->pxIndex;0 i7 ^4 G/ q( C5 v3 d. B7 d
- % k% j4 y' |8 U. a0 i- v
- /*以下两句为新插入结点指定前后结点,可以比喻为孩子找到了爹妈。*/5 e, n" J2 S2 ~4 ]1 `7 k9 q( L
- $ S. b* U4 W B% F
- /*使得新插入的结点的下一个结点指向当前链表pxList中的pxIndex的下一个结点。*/$ d, Q" e. x% @ V" [; ?
- pxNewListItem->pxNext = pxIndex->pxNext;2 c( d8 u9 M; S+ e% F0 k
- 6 L7 D% i S$ `9 U9 J8 F, ]# r
- /*使得新插入的结点的上一个结点指向当前链表pxList中的pxIndex。*/' _" n E' K# t) e( J n
- pxNewListItem->pxPrevious = pxList->pxIndex;2 M5 b+ B, ^8 Y% O% T4 D
& M! [9 w2 b: Z- /*以下两句使得当前链表认得新插入的结点,即爹妈要认识这是自己的孩子。
: ]; P# m1 [: G- [3 T - 即当前链表的pxNext以及pxPrevious都指向新插入结点(因为当前链表只有这 x% U# N0 ~1 W; O* c7 ^! V
- 一个结点,除了xListEnd)。*/
6 u1 }* `$ L- Q8 D
( M, B8 n& v/ _5 n9 V$ C3 x' ~, j- /*使得当前链表pxList中的pxIndex的上一个的下一个(醉了,不知道为什么要1 u; @3 ]; J: E5 z
- 这样指来指去,最后还是指到了pxIndex,不还是自己嘛,汗。)指向新插入的结点。*/
" y6 ?* H2 K# f, E" j. c4 v - pxIndex->pxNext->pxPrevious = ( volatile xListItem * ) pxNewListItem; n$ f$ @1 `* C9 p; \+ J2 J. }
/ H ?* H% _! t* c- /*使得当前链表pxList中的pxIndex的下一个(pxNext)指向新插入的结点。*/ S4 {. P7 a! f5 [- o
- pxIndex->pxNext = ( volatile xListItem * ) pxNewListItem;% R9 D) E6 p% F/ Z2 T
1 n$ B( l1 h! p- /*使得当前链表pxList中的pxIndex指向新插入的结点。*/
/ b6 P, ]6 f' Q - pxList->pxIndex = ( volatile xListItem * ) pxNewListItem;
]$ d$ m6 U; _+ Z. j - . O: w4 N( v \* E; ?
- /* 让pxList知道这是他的结点。 */
# N4 ?% h0 t$ Q - pxNewListItem->pvContainer = ( void * ) pxList;
j: ]9 o T6 i5 d
1 v( V% r K) D% U [) r% i- /*链表结点的数量自加1*/
8 }( G( O% Z( x( F0 W& A - ( pxList->uxNumberOfItems )++;
) e; }" f# Y7 W6 ~7 H - }
复制代码 指针指来指去的,想想也头大,等下画个图。' J8 N! q7 B# J. M2 o" t
6 ^$ v' e! h4 X: b( D4 o |
代码中28行的分析错误二得很,今天看这些代码有新的理解,这样才是正确的。/ [+ z" r2 [( I$ m- W2 o
% Y$ z @5 C5 k
这句代码讲的是:" g' ]7 ~5 L3 p" m d1 A" }
使得当前链表pxList中的pxIndex指针中的pxNext指针中的pxIndex指针指向新插入的结点pxNexListIetm,这样解释有点儿罗嗦,简而言之,就是将pxList中pxIndex指向的下一个结点的指向规则不再指向以前的旧结点,而是指向新插入的结点pxNexListIetm$ M. m3 y7 K$ n3 ^1 l0 Y
, h: q3 h1 e5 d( T! ^3 l: Z0 K: ]
下面讲的也是扯淡了,勿喷。。。$ @: {+ m O. _* o5 z
引用一个大神讲的,看完这个思路才清晰/ D0 X8 e2 p' J, E* O8 g" A
也没想到,插图倒是正确的了,尴尬