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<stdio.h></code>
<code>#include<stdlib.h></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->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->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 && P->Data != X)</code>
<code> </code><code>P = P->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->Next != NULL && P->Next->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->Next;</code>
<code> </code><code>P->Next = Temp->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->Data = X;</code>
<code> </code><code>if</code><code>(NULL == L->Next)</code>
<code> </code><code>L->Next = P;</code>
<code> </code><code>P->Next = NULL;</code>
<code> </code><code>P->Next = L->Next;</code>
<code>/*尾插*/</code>
<code>void</code> <code>TialInsert(</code><code>int</code> <code>X,Pnode L,Pnode P)</code>
<code> </code><code>P->Next = NULL;</code>
<code> </code><code>Pnode T = L;</code>
<code> </code><code>while</code><code>(NULL != T->Next)</code>
<code> </code><code>T = T->Next;</code>
<code> </code><code>T->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->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,如需轉載請自行聯系原作者