數據結構——線性表的實現

以下內容僅作爲課程學習的參考

具體要求

實現線性表,演示線性表的基本操作結果。

主要內容:

基於順序表實現線性表ADT
基於鏈表實現線性表ADT

實驗步驟及遇到問題分析與解決:
一、基於順序表實現線性表ADT

線性表的物理實現有順序表與鏈表兩種,順序表更簡單易用,所以先進行線性表順序表的實現。
思考過程:
在這裏插入圖片描述
數據對象:選擇模板類函數template 實現數據對象的多用性。
數據關係:線性關係。
基本操作:實現較爲常見的基本操作,如插入、刪除、當前位置移動等基本操作。
實現模塊:
① 輸入模塊:建立簡單的交互界面,通過序號的輸入實現操作(如下圖)。
在這裏插入圖片描述
② 功能模塊
在這裏插入圖片描述

③ 輸出模塊:根據對應的功能操作進行輸出。

遇到問題分析與解決:

【1】採用虛類繼承方法構造線性表,實現對應功能。
分析及解決:構造虛基類,通過虛類繼承的方法構造順序表,增加了程序的可拓展性。
【2】使用模板template 實現數據對象的多用性。出現報錯報錯(GCC): error: need ‘typename’ before ‘E::xxx’ because ‘E’ is a dependent scope
分析及解決:通過查詢,得知了這樣兩個概念——
從屬名稱(dependent names): 模板(template)內出現的名稱, 相依於某個模(template)參數, 如E t;
嵌套從屬名稱(nested dependent names):從屬名稱在class內呈嵌套裝, 如E::const_iterator ci;
如果不特定指出typename, 嵌套從屬名稱, 有可能產生解析(parse)歧義.
所以,任何時候在模板(template)中指涉一個嵌套從屬類型名稱, 需要在前一個位置, 添加關鍵字typename;進行如下操作解決了問題:
在每一個函數前指出模板template
【3】什麼是demo程序?如何實現?
分析及解決:demo程序是用來測試線性表ADT的實現是否成功,所以決定通過使用簡單的交互對實現的功能進行全面的測試,依次來檢查線性表的實現是否存在錯誤。
移除當前位置操作測試過程

二、基於鏈表實現線性表ADT

鏈表的實現需要用到指針進行操作,對於指針的掌握及使用提出要求,雖然實現過程比較數組來說比較複雜,但卻靈活。
思考過程:
在這裏插入圖片描述
數據對象:選擇模板類函數template 實現數據對象的多用性。
數據關係:線性關係。
基本操作:實現較爲常見的基本操作,如插入、刪除、當前位置移動等基本操作。
實現模塊:
① 輸入模塊:建立簡單的交互界面,通過序號的輸入實現操作(如下圖)。
在這裏插入圖片描述
② 功能模塊
在這裏插入圖片描述
③ 輸出模塊:根據對應的功能操作進行輸出。

遇到問題分析與解決:

【1】在使用鏈表實現時,怎麼分配新的內存?
分析及解決:查閱資料,可以知道new是C++中的操作符,當我們使用關鍵字new在堆上動態創建一個對象時,它做了三件事:獲得一塊內存空間、調用構造函數、返回正確的指針。所以,使用new來進行分配內存操作。
New操作符的使用
【2】指針指向?前驅結點的next指針域?後繼結點的prev指針域?
分析及解決:每個結點都存有一個數據和兩個指針,指針分別指向前驅結點和後繼結點,如圖:
在這裏插入圖片描述
需要了解這一點之後,才能對指針的指向進行分析。指針的最後一個指向代表着該結點的next(prev)指針的指向,例如:
解釋爲:temp的前驅結點的next指針指向tempnew解釋爲:tempnew的前驅結點=temp的前驅結點要根據具體的情況、指針的特性,進行分析。(以上爲個人理解)

具體代碼實現:https://download.csdn.net/download/forest_one/11775705
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章