天天看點

連結清單

1.總結

說到資料結構,第一個想到的就是連結清單,因為後面是以的資料結構都是可以通過連結清單的形式實作。

2.時間複雜度

說到算法,第一個想到的就是效率問題,讓我們簡單看下時間複雜度:如果一個算法用常數時間(O(1))将問題的大小消減為其一部分(通常是二分之一),那木該算法就是O(logN),如果使用常數時間隻是把問題減少一個常數(如将問題減少1),那木這種算法就是O(N)。

3.單連結清單(為了友善分析,連結清單都是帶有頭結點資料域不存放值)

<a href="https://s5.51cto.com/wyfs02/M02/05/FD/wKiom1mvohXRSvD3AAAPrUcfeYM026.png" target="_blank"></a>

代碼實作如下(每個函數傳入指針預設不是NULL):

<code>node.h</code>

<code>#ifndef _LIST_</code>

<code>#define _LIST_</code>

<code>typedef</code> <code>struct</code> <code>node{</code>

<code>    </code><code>int</code> <code>Data;</code>

<code>    </code><code>struct</code> <code>node *Next;</code>

<code>}*Pnode,Node;</code>

<code>int</code> <code>IsEmpty(Pnode L);</code>

<code>int</code> <code>IsLast(Pnode L);</code>

<code>Pnode Find(</code><code>int</code> <code>X,Pnode L);</code>

<code>void</code> <code>Delete(</code><code>int</code> <code>X,Pnode L);</code>

<code>Pnode FindPrevious(</code><code>int</code> <code>X,Pnode L);</code>

<code>void</code> <code>HeadInsert(</code><code>int</code> <code>X,Pnode L,Pnode P);</code>

<code>void</code> <code>TialInsert(</code><code>int</code> <code>X,Pnode L,Pnode P);</code>

<code>void</code> <code>DisplayList(Pnode L);</code>

<code>Pnode MallocNode();</code>

<code>#endif</code>

<code>node.c</code>

<code>#include&lt;stdio.h&gt;</code>

<code>#include&lt;stdlib.h&gt;</code>

<code>#include"node.h"</code>

<code>/*申請節點*/</code>

<code>Pnode MallocNode()</code>

<code>{</code>

<code>    </code><code>Pnode P = (Pnode)</code><code>malloc</code><code>(</code><code>sizeof</code><code>(Node));</code>

<code>    </code><code>if</code><code>(NULL != P)</code>

<code>    </code><code>{</code>

<code>        </code><code>return</code> <code>P;</code>

<code>    </code><code>}</code>

<code>    </code><code>else</code>

<code>        </code><code>return</code> <code>NULL;</code>

<code>}</code>

<code>/*判斷是否為空*/</code>

<code>int</code> <code>IsEmpty(Pnode L)</code>

<code>    </code><code>if</code><code>(L-&gt;Next == NULL)</code>

<code>        </code><code>return</code> <code>0;</code>

<code>    </code><code>return</code> <code>-1;</code>

<code>/*判斷是否是最後一個節點*/</code>

<code>int</code> <code>IsLast(Pnode L)</code>

<code>/*查找資料域為X的節點*/</code>

<code>Pnode Find(</code><code>int</code> <code>X,Pnode L)</code>

<code>    </code><code>Pnode P = L-&gt;Next;</code>

<code>    </code><code>if</code><code>(0 == IsEmpty(L))</code>

<code>        </code><code>printf</code><code>(</code><code>"list is empty!\n"</code><code>);</code>

<code>    </code><code>while</code><code>(P != NULL &amp;&amp; P-&gt;Data != X)</code>

<code>        </code><code>P = P-&gt;Next;</code>

<code>    </code><code>return</code> <code>P;</code>

<code>/*查找資料域為X的前驅節點*/</code>

<code>Pnode FindPrevious(</code><code>int</code> <code>X,Pnode L)</code>

<code>    </code><code>Pnode P = L;</code>

<code>    </code><code>while</code><code>(P-&gt;Next != NULL &amp;&amp; P-&gt;Next-&gt;Data != X )</code>

<code>/*删除資料為X的節點*/</code>

<code>void</code> <code>Delete(</code><code>int</code> <code>X,Pnode L)</code>

<code>    </code><code>Pnode P,Temp;</code>

<code>        </code><code>return</code> <code>;</code>

<code>    </code><code>P = FindPrevious(X,L);</code>

<code>    </code><code>if</code><code>(0 != IsLast(P))</code>

<code>        </code><code>Temp = P-&gt;Next;</code>

<code>        </code><code>P-&gt;Next = Temp-&gt;Next;</code>

<code>        </code><code>free</code><code>(Temp);</code>

<code>        </code><code>printf</code><code>(</code><code>"no find data!\n"</code><code>);</code>

<code>        </code><code>return</code><code>;</code>

<code>/*頭插*/</code>

<code>void</code> <code>HeadInsert(</code><code>int</code> <code>X,Pnode L,Pnode P)</code>

<code>    </code><code>P-&gt;Data = X;</code>

<code>    </code><code>if</code><code>(NULL == L-&gt;Next)</code>

<code>        </code><code>L-&gt;Next = P;</code>

<code>        </code><code>P-&gt;Next = NULL;</code>

<code>        </code><code>P-&gt;Next = L-&gt;Next;</code>

<code>/*尾插*/</code>

<code>void</code> <code>TialInsert(</code><code>int</code> <code>X,Pnode L,Pnode P)</code>

<code>    </code><code>P-&gt;Next = NULL;</code>

<code>    </code><code>Pnode T = L;</code>

<code>    </code><code>while</code><code>(NULL != T-&gt;Next)</code>

<code>        </code><code>T = T-&gt;Next;</code>

<code>    </code><code>T-&gt;Next = P;</code>

<code>/*顯示連結清單*/</code>

<code>void</code> <code>DisplayList(Pnode L)</code>

<code>    </code><code>while</code><code>(NULL != P)</code>

<code>        </code><code>printf</code><code>(</code><code>" %d"</code><code>,P-&gt;Data);</code>

4.雙向連結清單

<a href="https://s3.51cto.com/wyfs02/M02/05/FD/wKiom1mvonTyi1G3AAAQfPeZTQQ068.png" target="_blank"></a>

5.雙向循環連結清單

<a href="https://s5.51cto.com/wyfs02/M02/A4/AE/wKioL1mvommimiSsAAAO6spsgMk570.png" target="_blank"></a>

雙向連結清單和雙向循環連結清單以後用到再實作,上面的結構不對,應該有前驅指針。

<code>struct</code> <code>Node{</code>

<code>    </code><code>Ele Data;</code>

<code>    </code><code>struct</code> <code>Node *Tail;</code>

<code>    </code><code>struct</code> <code>Node *Next;</code>

本文轉自 8yi少女的夢 51CTO部落格,原文連結:http://blog.51cto.com/zhaoxiaohu/1963104,如需轉載請自行聯系原作者

繼續閱讀