亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

數據結構2----線性表順序存儲和鏈式存儲的實現(霜之小刀)

2019-11-11 04:51:35
字體:
來源:轉載
供稿:網友

歡迎轉載和引用,若有問題請聯系 若有問題,請聯系 Email : lihn1011@163.com QQ:2279557541

定義

所謂線性表,其實就是具有“線”一樣性質的表,所謂線一樣的性質,也就是具有n個數據元素的優先序列。其中n>=0

抽象數據模型

/** * 抽象的線性表接口 * 其中DataType表示線性表中所存儲的數據類型 */template<class DataType>class ListInterface{public: /** * @brief 用于判斷當前線性表是否為空 * @return true:為空 false:不為空 */ virtual bool IsEmpty() = 0; /** * @brief 獲取當前線性表的長度 * @return 表的長途 */ virtual unsigned int GetLength() = 0; /** * @brief 獲取線性表中的一個數據 * @param i數據所在的位置,也就是第幾個數據 * @param data 若數據獲取成功,則用于傳出數據 * @return 數據是否獲取成功 */ virtual bool GetItem(unsigned int i, DataType& data) = 0; /** * @brief 查找某個數據在線性表中的位置 * @param data 要查找的數據 * @return -1:查找失敗 else 查找的數據在線性表中的位置 */ virtual int FindItem (DataType data) = 0; /** * @brief 刪除線性表中的所有數據 */ virtual void Clear(); /** * @brief 向線性表中插入數據 * @param i 要插入線性表的位置 * @param data 要插入的數據 * @return 是否插入成功 */ virtual bool InsertItem(unsigned int i, DataType data) = 0; /** * @brief 刪除線性表中的某個數據 * @param i 要刪除的數據所處的位置 * @return 是否刪除成功 */ virtual bool DeleteItem(unsigned int i) = 0;};

其實線性表是可以擁有更多操作的,但是這里只列出了我認為最常用的一些。 雖然抽象完成了,但是要寫具體實現,這里就有點問題了,因為線性表的物理結構有兩種,分別為

順序存儲結構鏈式存儲結構

順序存儲結構的實現方式

/** * 線性列表的順序存儲實現 * 未考慮max_size溢出的情況 */template<class DataType,int max_size>class QueueList:public ListInterface<DataType>{public: QueueList() { m_length = 0; } /** * @brief 用于判斷當前線性表是否為空 * @return true:為空 false:不為空 */ virtual bool IsEmpty() { return m_length?true:false; } /** * @brief 獲取當前線性表的長度 * @return 表的長途 */ virtual unsigned int GetLength() { return m_length; } /** * @brief 獲取線性表中的一個數據 * @param i數據所在的位置,也就是第幾個數據 * @param data 若數據獲取成功,則用于傳出數據 * @return 數據是否獲取成功 */ virtual bool GetItem(unsigned int i, DataType& data) { if(i >= m_length)return false; data = m_data_list[i]; return true; } /** * @brief 查找某個數據在線性表中的位置 * @param data 要查找的數據 * @return -1:查找失敗 else 查找的數據在線性表中的位置 */ virtual int FindItem (DataType data) { for(int i = 0; i < m_length; i++) { if(data == m_data_list[i]) { return i; } } return -1; } /** * @brief 刪除線性表中的所有數據 */ virtual void Clear() { m_length = 0; } /** * @brief 向線性表中插入數據 * @param i 要插入線性表的位置 * @param data 要插入的數據 * @return 是否插入成功 */ virtual bool InsertItem(unsigned int i, DataType data) { if(i <= m_length) { for(int idx = m_length;idx > i; idx--) { m_data_list[idx] = m_data_list[idx-1]; } m_data_list[i] = data; m_length++; return true; } return false; } /** * @brief 刪除線性表中的某個數據 * @param i 要刪除的數據所處的位置 * @return 是否刪除成功 */ virtual bool DeleteItem(unsigned int i) { if(i >= m_length) { return false; } for(int idx = i; idx < m_length; idx++) { m_data_list[idx] = m_data_list[idx+1]; } m_length--; return true; }PRivate: DataType m_data_list[max_size]; unsigned int m_length;};

我們發現這個線性表的順序存儲結構有以下特點

表中數據的多少只需修改m_length即可改變。無論表中當前數據有多少,實際的存儲數據的區域都不會發生變化,也就是有多余的內存空間會被浪費。最大容量有限制,如果要動態,則會增加拷貝和內存管理工作,效率底下。插入刪除一個元素時,需要移動操作點后面的所有數據,效率底下。獲取表中某個數據時,可以直接索引,效率非常高。

鏈式存儲結構的實現方式

/** * 線性列表的順序存儲實現 * 未考慮max_size溢出的情況 */template<class DataType,int max_size>class QueueList:public ListInterface<DataType>{public: QueueList() { m_length = 0; } /** * @brief 用于判斷當前線性表是否為空 * @return true:為空 false:不為空 */ virtual bool IsEmpty() { return m_length?true:false; } /** * @brief 獲取當前線性表的長度 * @return 表的長途 */ virtual unsigned int GetLength() { return m_length; } /** * @brief 獲取線性表中的一個數據 * @param i數據所在的位置,也就是第幾個數據 * @param data 若數據獲取成功,則用于傳出數據 * @return 數據是否獲取成功 */ virtual bool GetItem(unsigned int i, DataType& data) { if(i >= m_length)return false; data = m_data_list[i]; return true; } /** * @brief 查找某個數據在線性表中的位置 * @param data 要查找的數據 * @return -1:查找失敗 else 查找的數據在線性表中的位置 */ virtual int FindItem (DataType data) { for(int i = 0; i < m_length; i++) { if(data == m_data_list[i]) { return i; } } return -1; } /** * @brief 刪除線性表中的所有數據 */ virtual void Clear() { m_length = 0; } /** * @brief 向線性表中插入數據 * @param i 要插入線性表的位置 * @param data 要插入的數據 * @return 是否插入成功 */ virtual bool InsertItem(unsigned int i, DataType data) { if(i <= m_length) { for(int idx = m_length;idx > i; idx--) { m_data_list[idx] = m_data_list[idx-1]; } m_data_list[i] = data; m_length++; return true; } return false; } /** * @brief 刪除線性表中的某個數據 * @param i 要刪除的數據所處的位置 * @return 是否刪除成功 */ virtual bool DeleteItem(unsigned int i) { if(i >= m_length) { return false; } for(int idx = i; idx < m_length; idx++) { m_data_list[idx] = m_data_list[idx+1]; } m_length--; return true; }private: DataType m_data_list[max_size]; unsigned int m_length;public: void Show() { qDebug()<<"start========"; for(int i = 0; i < m_length; i++) { DataType data; GetItem(i, data); qDebug()<<data; } qDebug()<<"end========"; }};template<class DataType>class LinkedList:public ListInterface<DataType>{public: LinkedList():m_length(0),m_head(NULL) { } /** * @brief 用于判斷當前線性表是否為空 * @return true:為空 false:不為空 */ virtual bool IsEmpty() { return m_length?true:false; } /** * @brief 獲取當前線性表的長度 * @return 表的長途 */ virtual unsigned int GetLength() { return m_length; } /** * @brief 獲取線性表中的一個數據 * @param i數據所在的位置,也就是第幾個數據 * @param data 若數據獲取成功,則用于傳出數據 * @return 數據是否獲取成功 */ virtual bool GetItem(unsigned int i, DataType& data) { if(i >= m_length)return false; LinkStu* p = m_head; while(i--) { p=p->m_next; } data = p->m_data; return true; } /** * @brief 查找某個數據在線性表中的位置 * @param data 要查找的數據 * @return -1:查找失敗 else 查找的數據在線性表中的位置 */ virtual int FindItem (DataType data) { int finded_idx = 0; LinkStu* p = m_head; while(p) { if(data == p->m_data) { return finded_idx; } finded_idx++; } return -1; } /** * @brief 刪除線性表中的所有數據 */ virtual void Clear() { while(DeleteItem(0)); m_length = 0; } /** * @brief 向線性表中插入數據 * @param i 要插入線性表的位置 * @param data 要插入的數據 * @return 是否插入成功 */ virtual bool InsertItem(unsigned int i, DataType data) { if(i <= m_length) { LinkStu* new_link = new LinkStu(); new_link->m_data = data; if(i == 0) { new_link->m_next = m_head; m_head = new_link; } else { LinkStu* p = m_head; LinkStu* pre_p = m_head; for(int idx = 0; idx != i; idx++) { pre_p = p; p = p->m_next; } pre_p->m_next = new_link; new_link->m_next = p; } m_length++; return true; } return false; } /** * @brief 刪除線性表中的某個數據 * @param i 要刪除的數據所處的位置 * @return 是否刪除成功 */ virtual bool DeleteItem(unsigned int i) { if(i >= m_length) { return false; } if(i == 0) { LinkStu* p = m_head; m_head = m_head->m_next; delete p; } else { LinkStu* p = m_head; LinkStu* pre_p = m_head; for(int idx = 0; idx != i; idx++) { pre_p = p; p = p->m_next; } pre_p->m_next = p->m_next; delete p; } m_length--; return true; }private: struct LinkStu { DataType m_data; LinkStu* m_next; LinkStu():m_next(NULL){} }; unsigned int m_length; LinkStu* m_head;};表中數據的增減會直接增加或減少內存的占用量。邏輯上表的大小是無限的。插入刪除一個元素時,只要找到了元素的位置,操作效率非常高。獲取表中某個數據時,效率較低。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
在线观看国产精品淫| 欧美激情性做爰免费视频| 欧美放荡办公室videos4k| 黑人欧美xxxx| 一个色综合导航| 岛国av午夜精品| 欧洲美女免费图片一区| 久久视频国产精品免费视频在线| 欧美一区二区大胆人体摄影专业网站| 国产精品v日韩精品| 亚洲电影免费在线观看| 亚洲精品456在线播放狼人| 国产视频久久久久| 九九精品视频在线| 久久九九国产精品怡红院| 麻豆精品精华液| 国产精品88a∨| 操人视频在线观看欧美| 亚洲级视频在线观看免费1级| 欧美中文字幕在线视频| 九色精品免费永久在线| 亚洲欧美在线一区| 国内精品久久久久久中文字幕| 亚洲精选在线观看| 欲色天天网综合久久| 456亚洲影院| 欧美日韩国产综合视频在线观看中文| 日韩专区在线播放| 国产日韩在线观看av| 视频在线一区二区| 亚洲精品综合精品自拍| 亚洲国产精品久久久久| 欧美综合一区第一页| 亚洲精品国产品国语在线| 深夜成人在线观看| 国产日韩精品入口| 亚洲无亚洲人成网站77777| 久久精品国产一区二区电影| 精品视频久久久久久久| 精品视频9999| 91av国产在线| 欧美视频中文字幕在线| 91成人精品网站| 亚洲免费视频一区二区| 欧美xxxwww| 欧美日韩亚洲一区二区三区| 国产一区二区三区中文| 久久91亚洲人成电影网站| 国产精品嫩草视频| 最近2019中文字幕大全第二页| 亚洲电影免费观看高清| 国产美女精品视频免费观看| 亚洲3p在线观看| 91中文精品字幕在线视频| 91亚洲国产成人久久精品网站| 九九久久久久99精品| 国产一区二区久久精品| 国产精品综合不卡av| 国产成人福利夜色影视| 午夜免费在线观看精品视频| 国产剧情日韩欧美| 91免费欧美精品| 成人欧美一区二区三区在线湿哒哒| 色噜噜久久综合伊人一本| 韩国三级电影久久久久久| 久久久成人精品视频| 国产精品精品视频| 日韩激情av在线免费观看| 欧美日本高清视频| 中文字幕日韩综合av| 91免费高清视频| 91性高湖久久久久久久久_久久99| 成人写真视频福利网| 狠狠干狠狠久久| 欧美性色视频在线| 亚洲图片在区色| 九九热精品视频国产| 亚洲欧美日韩久久久久久| 久久久亚洲国产天美传媒修理工| 欧美成人免费全部| 久久精品91久久香蕉加勒比| 韩国欧美亚洲国产| 亚洲最大在线视频| 九九热这里只有精品6| 精品国偷自产在线视频99| 国产成人福利网站| 日韩精品免费在线播放| 国产成人jvid在线播放| 日韩在线观看免费| 91av在线免费观看视频| 久久久999精品视频| 国产成人高清激情视频在线观看| 国产精品第3页| 色阁综合伊人av| 亚洲午夜精品久久久久久久久久久久| 亚洲伊人成综合成人网| 日韩欧美一区二区在线| 精品欧美激情精品一区| 亚洲国产精品悠悠久久琪琪| 中文字幕在线看视频国产欧美在线看完整| 91久久精品国产91久久性色| 热久久这里只有| 97超碰蝌蚪网人人做人人爽| 日韩av一区二区在线观看| 日韩av手机在线| 国产一区二区三区在线观看视频| 在线观看精品自拍私拍| 日本道色综合久久影院| 久久亚洲精品一区| 91社影院在线观看| 日本一区二区三区四区视频| 97在线看福利| 欧美—级高清免费播放| 91精品国产91久久久久久| 亚洲全黄一级网站| 国产精品久久久久久亚洲影视| 国产精品爽爽ⅴa在线观看| 亚洲老头同性xxxxx| 国产精品电影观看| 国产午夜精品一区理论片飘花| 欧美诱惑福利视频| 这里只有精品在线播放| 欧美国产中文字幕| 久热精品在线视频| 日韩黄在线观看| 国产福利精品在线| 亚洲qvod图片区电影| 国产亚洲欧洲在线| 久久久久九九九九| 成人精品久久久| 性欧美xxxx视频在线观看| 国产精品高潮呻吟久久av野狼| 欧美亚洲国产另类| 亚洲国产精品一区二区三区| 国产色综合天天综合网| 国产精品视频免费观看www| 欧美日韩999| 午夜精品久久久久久久99黑人| 色多多国产成人永久免费网站| 亚洲成人在线网| 91精品视频播放| 亚洲品质视频自拍网| 日韩中文字幕免费| 亚洲va欧美va在线观看| 欧美性猛交xxxx久久久| 成人久久久久爱| 97av在线视频| 国产色婷婷国产综合在线理论片a| 日韩中文字幕视频在线| 国产精品福利无圣光在线一区| 91精品视频观看| 丝袜美腿亚洲一区二区| 午夜精品蜜臀一区二区三区免费| 国产一区二区香蕉| 最近2019中文字幕第三页视频| 欧美日韩国产成人高清视频| 成人免费午夜电影| 久久天天躁夜夜躁狠狠躁2022| 亚洲第一网中文字幕| 国产主播喷水一区二区| 日韩成人av在线播放| 亚洲综合中文字幕68页| 日韩欧美中文免费| 51精品国产黑色丝袜高跟鞋|