- 1、本文档共59页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
4-3單向鏈結串列
第4章 鏈結串列(Linked Lists) 4-1 動態記憶體配置 4-2 鏈結串列的基礎 4-3 單向鏈結串列 4-4 環狀鏈結串列 4-5 雙向鏈結串列 4-6 鏈結串列的應用 - 多項式表示法 4-1 動態記憶體配置-說明 動態記憶體配置不同於陣列的靜態記憶體配置是在編譯階段就配置記憶體空間,動態記憶體配置是等到執行階段,才向作業系統要求配置所需的記憶體空間,可以讓程式設計者靈活運用程式所需的記憶體空間。 在C語言stdlib.h標頭檔的標準函式庫提供兩個函數:malloc()和free(),可以配置和釋放程式所需的記憶體空間。 4-1 動態記憶體配置-malloc() malloc()函數:配置記憶體空間 C語言的程式碼可以呼叫malloc()函數向作業系統取得一塊可用的記憶體空間,函數的語法,如下所示: fp = (資料型態*) malloc(sizeof(資料型態)); 上述語法因為函數傳回void通用型指標,所以需要加上型態迫換,將函數傳回的指標轉換成指定資料型態的指標,sizeof運算子可以計算指定資料型態的大小。例如:配置一個浮點數變數的記憶空間,如下所示: fp = (float *) malloc(sizeof(float)); struct test *score; score=(struct test *) malloc(num*sizeof(struct test)); 4-1 動態記憶體配置-free() free()函數:釋放配置的記憶體空間 free()函數可以釋放malloc()函數配置的記憶體空間,例如:指標fp是一個指向malloc()函數傳回的浮點數記憶體空間的指標,呼叫free()函數釋放這塊記憶體,如下所示: free(fp); 上述程式碼的指標fp可以是float浮點數指標,也可以是malloc()函數傳回的其它資料型態指標、陣列或結構指標。 4-2 鏈結串列的基礎-說明 「有序串列」(Ordered List)或稱為「線性串列」(Linear List)是一種元素間擁有順序的集合,如下所示: (a0, a1, a2, …, an),ai,0 = i = n 上述集合是一個線性串列,如果是空的線性串列,表示串列中沒有任何元素,是使用( )空括號表示。 4-2 鏈結串列的基礎-範例 一些線性串列的範例,如下所示: 英文的月份:( Jan, Feb, March, …, Oct, Nov, Dec )。 英文的星期:( Mon, Tue, Wed, Thu, Fri, Sat, Sun )。 撲克牌的點數:( A, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K )。 樓層:( B2, B1, 1, 2, 3, 4, 5, 6 )。 生肖:( 鼠, 牛, 虎, …… , 狗, 猪 )。 4-2 鏈結串列的基礎-運算 線性串列的相關運算,如下所示: length():取得線性串列的長度。 get():存取線性串列的第i個元素。 search():從左到右,或從右到左走訪線性串列。 delete():在線性串列第i個元素刪除元素。 insert():在線性串列第i個元素插入元素。 4-2 鏈結串列的基礎-使用陣列實作線性串列 4-2 鏈結串列的基礎-使用陣列實作線性串列(問題) 複雜的新增與刪除運算:在新增或刪除名單時,因為陣列儲存的是循序且連續資料,所以在陣列中需要搬移大量元素,才能滿足同縣巿位在同一區段。例如:在桃園巿新增江小魚,則王小美、李光明和周星星都需要依序往後搬移1個元素,才能將江小魚插入,同理,刪除王大毛時,之後的所有元素也需要往前搬移。 浪費記憶體空間:因為並不知道名單有多少位,所以需要宣告一個很大的結構陣列來儲存名單,如果最後只使用到幾個元素,就會造成大量記憶體空間的閒置。 4-2 鏈結串列的基礎-使用鏈結串列實作線性串列 「鏈結串列」(Linked Lists)是一種實作線性串列的資料結構。在現實生活中,鏈結串列如同火車掛車廂以線性方式將車廂連結起來,每個車廂是鏈結串列的節點(Nodes),儲存線性串列的資料,車廂和車廂之間的鏈結,就是節點間的鏈結(Link)。如下圖所示: 4-2 鏈結串列的基礎-使用鏈結串列實作線性串列(實作) 在C語言建立鏈結串列是宣告一個結構作為節點,內含指標的成員變數來鏈結其它節點,使用動態記憶體配置在執行階段配置節點所需的記憶體空間,即可解決結構陣列實作上浪費記憶體的問題。 例如:使用鏈結串列建立的郵寄名單,筆者僅以編號(從大到小)代表名單的節點資料,郵寄名單的鏈結串列,如下圖所示: 4-3 單向鏈結串列 4-3-1 建立和走訪單向鏈結串列 4-3-2 刪除單向鏈結串列的節點 4-3-3 插入單向
文档评论(0)