今天晚上被一段代碼弄得糾結了半天,最後發現了在使用C語言指針時的的一個不容易發現的陷阱。
請看下面兩段代碼,考慮其功能有何不同:
代碼段1:
t=q->next; p->next=q->next->next; q=p=p->next; free(t);代碼段2:
p->next=q->next->next; t=q->next; q=p=p->next; free(t);其中最主要的不同點就在於“t=q->next;”的位置不同。
在代碼段1中,t指向的q的下一個節點,但在代碼段2中,t指向得卻是q的下一個節點的下一個節點,陷阱就在這裡!
注意,一個節點的next域是固定的,當修改了節點的next域後,不管有多少指針指向這個節點,那麼,這些指針的next節點均為修改後的節點,所以,以後要想刪除某個節點後的節點時,必須要做到代碼段1中的處理方法,先找一個指針指向下一個節點,這樣,不管怎麼修改那個節點的next域,都不會對他的下一個節點產生影響。