詳解鏈表
關於鏈表(List),是學C之人常問的問題,本帖試圖給初學者詳細解釋這方面的内容。首先看看鏈表的模型,如下圖:
圖中,縱向表示內存空間,由於計算機的內存都是綫性的,所以縱坐標1、2、……12等就是內存地址。藍色的是一個鏈表數據的映像,Data是封裝的數據包,可以是任何數據類型,包括基本類型和用戶自定義類型(結構體或類);Next是鏈表數據結構中的指針,這是一個單向鏈表,它指向下一個元素的地址。在邏輯上,鏈表其實就是一個數組Node[],不過,這個數組的元素不是連續分佈的,元素可以在內存的任何位置(即可以亂序),抽象出來的數組Node[],每個元素記錄的是數據的地址,亦即這可視爲一個指針數組,每個元素都是指針——這個數組在我們的大腦中。
如圖:鏈表的頭結點指針Head,指向第1個元素的地址,這個地址是3,按圖索驥,我們到第3列上找到這個數據Node[0],也就找到它的數據包Data1,用解指針引用操作,可以取出這個數據(注意:凡是指針引用數據,均是這般間接的,先取地址,然後取數據,是兩步,CPU的動作多了)。找到第1個元素之後,我們可以依據它的Next指針找到第2個數據,它指向地址6。看到沒有?鏈表的數據地址與數組不同之處正在這裏,數據的分佈不是連續的!這就所謂“鏈”的意思,用Next指針這個“鈎”,把各個元素串起來,一旦其中一個環節(結點)的指針指錯了地方,整個鏈條就斷開了(鏈表的脆弱性正在這裏)。
對數組,我們可以直接從下標定位到數據處,因爲每個元素都是整齊排列的,間隙一樣,用下標定位數據的尋址很快捷,乘數就是了。但鏈表不一樣,如上所言,要找到鏈表的一個元素,必須從某個節點開始,逐個從它的Next開始找下去,直到找到爲止。你無法跳過任何一個元素!鏈表的隨機查尋效率比數組低,這是依據模型就可以理解的。
[ 本帖最后由 TonyDeng 于 2015-3-17 01:30 编辑 ]