C語言實現(xiàn)常用數(shù)據(jù)結(jié)構(gòu):基本概念(第0篇)

寫在前面:為什么學(xué)習(xí)C語言數(shù)據(jù)結(jié)構(gòu)

今天開始,我準(zhǔn)備和一起分享學(xué)習(xí)C語言常用數(shù)據(jù)結(jié)構(gòu),這里不求事無巨細(xì)的掌握數(shù)據(jù)結(jié)構(gòu)的方方面面,而是學(xué)習(xí)編程、考試等實際中常用的重要數(shù)據(jù)結(jié)構(gòu),這里以分享可以運行的代碼為學(xué)習(xí)主要方式,因為可運行的代碼有時候是最好的老師。

數(shù)據(jù)結(jié)構(gòu)和算法是十分重要的。C語言+數(shù)據(jù)結(jié)構(gòu)+算法=C語言程序??紤]下編程的過程:對于一個真實的問題,編程解決步驟往往是:第一步分析問題,第二步找到數(shù)學(xué)方法“紙面上”解決它,也就是找到“算法”,第三步選擇合適的數(shù)據(jù)結(jié)構(gòu)存放數(shù)據(jù),實現(xiàn)“算法”,第四步選擇編程語言,編寫可執(zhí)行的代碼,實現(xiàn)數(shù)據(jù)結(jié)構(gòu)和算法。其中第二步很關(guān)鍵,思考算法。

數(shù)據(jù)結(jié)構(gòu)概念

是指相互之間存在一種或多種關(guān)系的數(shù)據(jù)元素的集合,使用集合二元組來描述有兩個要素部分,分別是數(shù)據(jù)元素集合、數(shù)據(jù)元素關(guān)系集合。

數(shù)據(jù)結(jié)構(gòu)完整描述可以分為邏輯結(jié)構(gòu)和存儲結(jié)構(gòu),邏輯結(jié)構(gòu)描述本質(zhì)上的關(guān)系,存儲結(jié)構(gòu)是根據(jù)計算機和編程語言特點實現(xiàn)關(guān)系,一種邏輯結(jié)構(gòu)可以有多種存儲結(jié)構(gòu)實現(xiàn),同樣,一種存儲結(jié)構(gòu)可以被用于實現(xiàn)多種邏輯結(jié)構(gòu)。

邏輯結(jié)構(gòu)分類

邏輯結(jié)構(gòu)對應(yīng)數(shù)據(jù)結(jié)構(gòu)中數(shù)據(jù)元素的關(guān)系,簡單可以分為集合、線性、樹型、圖狀四類。

  • 集合:最松散的關(guān)系,相當(dāng)于空關(guān)系,只要數(shù)據(jù)元素取值屬于同一個集合即可。

  • 線性:一對一關(guān)系,數(shù)據(jù)元素邏輯上結(jié)構(gòu)是排列的一條“線”,有先后次序。

  • 樹型:一對多關(guān)系,存在一個父親結(jié)點和多個孩子結(jié)點,邏輯上是一顆“樹”。

  • 圖狀:多對多關(guān)系,數(shù)據(jù)元素可以有任意的對應(yīng)關(guān)系,形似一張“網(wǎng)圖狀”。

存儲結(jié)構(gòu)分類

存儲結(jié)構(gòu)是數(shù)據(jù)結(jié)構(gòu)的邏輯結(jié)構(gòu)在計算機中的物理實現(xiàn)表示,因此也可以稱為物理結(jié)構(gòu),簡單分為2大類:

  • 順序存儲方式:數(shù)據(jù)按照順序在內(nèi)存中存放,數(shù)據(jù)的邏輯順序和計算機物理內(nèi)存地址順序?qū)?yīng),C語言實現(xiàn)可以使用數(shù)組、動態(tài)內(nèi)存分配的順序表表示。

  • 鏈?zhǔn)酱鎯Ψ绞剑簲?shù)據(jù)可以在內(nèi)存中隨機存放,同時數(shù)據(jù)結(jié)點中通過一個指針將數(shù)據(jù)按照邏輯順序串接起來,例如鏈表。

算法

  • 算法是對特定問題的求解步驟的描述,是通用的數(shù)學(xué)意義上的問題求解。

  • 程序是算法在計算機中的一種實現(xiàn),需要使用特定的編程語言和計算機指令。

  • 算法常見時間復(fù)雜度大小關(guān)系:O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn),其中O(1)表示常量時間,和問題規(guī)模無關(guān)。

  • 算法空間復(fù)雜度:是指算法需要除數(shù)據(jù)元素之外的輔助空間大小,O(1)表示只需要固定的輔助空間,和問題規(guī)模無關(guān),原地工作。

對比理解

1.邏輯結(jié)構(gòu)和存儲結(jié)構(gòu):數(shù)據(jù)結(jié)構(gòu)的兩個重要方面,一種邏輯結(jié)構(gòu)可以有多種存儲結(jié)構(gòu)實現(xiàn),存儲結(jié)構(gòu)實現(xiàn)和計算機硬件特性、編程語言特性相關(guān),不同的存儲結(jié)構(gòu)實現(xiàn),其數(shù)據(jù)結(jié)構(gòu)最終的處理效率是不同的,各有優(yōu)劣。

2.數(shù)據(jù)結(jié)構(gòu)和算法:這兩個概念也是密切相關(guān),算法是對問題的求解,必然涉及到數(shù)據(jù)處理,因此需要選擇數(shù)據(jù)結(jié)構(gòu)存放數(shù)據(jù)。使用不同的數(shù)據(jù)結(jié)構(gòu)直接影響算法對于問題的處理效率。一個可以用計算機解決的實際問題,需要同時選擇一個合適的算法和數(shù)據(jù)結(jié)構(gòu),最終形成完整的可執(zhí)行程序。

3.數(shù)據(jù)結(jié)構(gòu)作用主要是處理數(shù)據(jù),因此基本上每種數(shù)據(jù)結(jié)構(gòu)都需要提供增加、修改、刪除、查詢、顯示數(shù)據(jù)等通用功能,根據(jù)數(shù)據(jù)結(jié)構(gòu)的具體存儲結(jié)構(gòu),其實現(xiàn)的過程和效率均不相同。

其實做為一個學(xué)習(xí)者,有一個學(xué)習(xí)的氛圍跟一個交流圈子特別重要這里我推薦一個C/C++基礎(chǔ)交流583650410,不管你是小白還是轉(zhuǎn)行人士歡迎入駐,大家一起交流成長。



?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容