c语言数据结构系统化,C语言数据结构+数据库+操作系统
http://cv.qiaobutang.com/post/55c419b20cf2009bd4607795
第二部分是專業(yè)相關(guān)的C ,數(shù)據(jù)庫(kù),操作系統(tǒng),數(shù)據(jù)結(jié)構(gòu)。
http://c.biancheng.net/cpp/u/shuju/
數(shù)據(jù)(Data)是信息的載體,它能夠被計(jì)算機(jī)識(shí)別、存儲(chǔ)和加工處理。它是計(jì)算機(jī)程序加工的原料,應(yīng)用程序處理各種各樣的數(shù)據(jù)。計(jì)算機(jī)科學(xué)中,所謂數(shù)據(jù)就是計(jì)算機(jī)加工處理的對(duì)象,它可以是數(shù)值數(shù)據(jù),也可以是非數(shù)值數(shù)據(jù)。數(shù)值數(shù)據(jù)是一些整數(shù)、實(shí)數(shù)或復(fù)數(shù),主要用于工程計(jì)算、科學(xué)計(jì)算和商務(wù)處理等;非數(shù)值數(shù)據(jù)包括字符、文字、圖形、圖像、語(yǔ)音等。
數(shù)據(jù)結(jié)構(gòu)(Data Structure)是指互相之間存在著一種或多種關(guān)系的數(shù)據(jù)元素的集合。在任何問(wèn)題中,數(shù)據(jù)元素之間都不會(huì)是孤立的,在它們之間都存在著這樣或那樣的關(guān)系,這種數(shù)據(jù)元素之間的關(guān)系稱為結(jié)構(gòu)。根據(jù)數(shù)據(jù)元素間關(guān)系的不同特性,通常有下列四類基本的結(jié)構(gòu):
集合結(jié)構(gòu)。在集合結(jié)構(gòu)中,數(shù)據(jù)元素間的關(guān)系是“屬于同一個(gè)集合”。集合是元素 關(guān)系極為松散的一種結(jié)構(gòu)。
線性結(jié)構(gòu)。該結(jié)構(gòu)的數(shù)據(jù)元素之間存在著一對(duì)一的關(guān)系。
樹(shù)型結(jié)構(gòu)。該結(jié)構(gòu)的數(shù)據(jù)元素之間存在著一對(duì)多的關(guān)系。
圖形結(jié)構(gòu)。該結(jié)構(gòu)的數(shù)據(jù)元素之間存在著多對(duì)多的關(guān)系,圖形結(jié)構(gòu)也稱作網(wǎng)狀結(jié)構(gòu)。
數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)可采用順序存儲(chǔ)或鏈?zhǔn)酱鎯?chǔ)的方法。
順序存儲(chǔ)方法是把邏輯上相鄰的元素存儲(chǔ)在物理位置相鄰的存儲(chǔ)單元中,由此得到的存儲(chǔ)表示稱為順序存儲(chǔ)結(jié)構(gòu)。順序存儲(chǔ)結(jié)構(gòu)是一種最基本的存儲(chǔ)表示方法,通常借助于程序設(shè)計(jì)語(yǔ)言中的數(shù)組來(lái)實(shí)現(xiàn)。
鏈?zhǔn)酱鎯?chǔ)方法對(duì)邏輯上相鄰的元素不要求其物理位置相鄰,元素間的邏輯關(guān)系通過(guò)附設(shè)的指針字段來(lái)表示,由此得到的存儲(chǔ)表示稱為鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu),鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)通常借助于程序設(shè)計(jì)語(yǔ)言中的指針類型來(lái)實(shí)現(xiàn)。
除了通常采用的順序存儲(chǔ)方法和鏈?zhǔn)酱鎯?chǔ)方法外,有時(shí)為了查找的方便還采用索引存儲(chǔ)方法和散列存儲(chǔ)方法。
數(shù)據(jù)類型
在高級(jí)程序設(shè)計(jì)語(yǔ)言中,數(shù)據(jù)類型可分為兩類:一類是原子類型,另一類則是結(jié)構(gòu)類型。原子類型的值是不可分解的。如C 語(yǔ)言中整型、字符型、浮點(diǎn)型、雙精度型等基本類型,分別用保留字int、char、float、double 標(biāo)識(shí)。而結(jié)構(gòu)類型的值是由若干成分按某種結(jié)構(gòu)組成的,因此是可分解的,并且它的成分可以是非結(jié)構(gòu)的,也可以是結(jié)構(gòu)的。例如,數(shù)組的值由若干分量組,每個(gè)分量可以是整數(shù),也可以是數(shù)組等。在某種意義上,數(shù)據(jù)結(jié)構(gòu)可以看成是“一組具有相同結(jié)構(gòu)的值”,而數(shù)據(jù)類型則可被看成是由一種數(shù)據(jù)結(jié)構(gòu)和定義在其上的一組操作所組成的。
⒈時(shí)間復(fù)雜度
一個(gè)程序的時(shí)間復(fù)雜度(Time complexity)是指程序運(yùn)行從開(kāi)始到結(jié)束所需要的時(shí)間。
一個(gè)算法是由控制結(jié)構(gòu)和原操作構(gòu)成的,其執(zhí)行時(shí)間取決于兩者的綜合效果。為了便于比較同一問(wèn)題的不同的算法,通常的做法是:從算法中選取一種對(duì)于所研究的問(wèn)題來(lái)說(shuō)基本運(yùn)算的原操作,以該原操作重復(fù)執(zhí)行的次數(shù)作為算法的時(shí)間度量。一般情況下,算法中原操作重復(fù)執(zhí)行的次數(shù)是規(guī)模n 的某個(gè)函數(shù)T(n)。許多時(shí)候要精確地計(jì)算T(n)是困難的,我們引入漸進(jìn)時(shí)間復(fù)雜度在數(shù)量上估計(jì)一個(gè)算法的執(zhí)行時(shí)間,也能夠達(dá)到分析算法的目的。
定義(大Ο記號(hào)):如果存在兩個(gè)正常數(shù)c 和n0,使得對(duì)所有的n,n≥n0,有:
f(n) ≤ cg(n)
則有:
f(n) = Ο(g(n))
例如,一個(gè)程序的實(shí)際執(zhí)行時(shí)間為T(n)=2.7n3+3.8n2+5.3。則T(n)=Ο(n3)。使用大Ο記號(hào)表示的算法的時(shí)間復(fù)雜度,稱為算法的漸進(jìn)時(shí)間復(fù)雜度(Asymptotic?Complexity)。
通常用Ο(1)表示常數(shù)計(jì)算時(shí)間。常見(jiàn)的漸進(jìn)時(shí)間復(fù)雜度有:
Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)<Ο(2n)
⒉空間復(fù)雜度
一個(gè)程序的空間復(fù)雜度(Space complexity)是指程序運(yùn)行從開(kāi)始到結(jié)束所需的存儲(chǔ)量。
程序的一次運(yùn)行是針對(duì)所求解的問(wèn)題的某一特定實(shí)例而言的。例如,求解排序問(wèn)題的排序算法的每次執(zhí)行是對(duì)一組特定個(gè)數(shù)的元素進(jìn)行排序。對(duì)該組元素的排序是排序問(wèn)題的一個(gè)實(shí)例。元素個(gè)數(shù)可視為該實(shí)例的特征。程序運(yùn)行所需的存儲(chǔ)空間包括以下兩部分:
⑴固定部分。這部分空間與所處理數(shù)據(jù)的大小和個(gè)數(shù)無(wú)關(guān),或者稱與問(wèn)題的實(shí)例的特征無(wú)關(guān)。主要包括程序代碼、常量、簡(jiǎn)單變量、定長(zhǎng)成分的結(jié)構(gòu)變量所占的空間。
⑵可變部分。這部分空間大小與算法在某次執(zhí)行中處理的特定數(shù)據(jù)的大小和規(guī)模有關(guān)。例如100 個(gè)數(shù)據(jù)元素的排序算法與1000 個(gè)數(shù)據(jù)元素的排序算法所需的存儲(chǔ)空間顯然是不同的。
線性表的定義
線性表是一種線性結(jié)構(gòu)。線性結(jié)構(gòu)的特點(diǎn)是數(shù)據(jù)元素之間是一種線性關(guān)系,數(shù)據(jù)元素“一個(gè)接一個(gè)的排列”。在一個(gè)線性表中數(shù)據(jù)元素的類型是相同的,或者說(shuō)線性表是由同一類型的數(shù)據(jù)元素構(gòu)成的線性結(jié)構(gòu)。在實(shí)際問(wèn)題中線性表的例子是很多的,如學(xué)生情況信息表是一個(gè)線性表:表中數(shù)據(jù)元素的類型為學(xué)生類型; 一個(gè)字符串也是一個(gè)線性表:表中數(shù)據(jù)元素的類型為字符型,等等。
綜上所述,線性表定義如下:線性表是具有相同數(shù)據(jù)類型的n(n>=0)個(gè)數(shù)據(jù)元素的有限序列,通常記為:
(a1,a2,… ai-1,ai,ai+1,…an)
其中n為表長(zhǎng), n=0 時(shí)稱為空表。
表中相鄰元素之間存在著順序關(guān)系。將ai-1 稱為ai 的直接前趨,ai+1 稱為ai 的直接后繼。就是說(shuō):對(duì)于ai,當(dāng)i=2,...,n 時(shí),有且僅有一個(gè)直接前趨ai-1.,當(dāng)i=1,2,...,n-1 時(shí),有且僅有一個(gè)直接后繼ai+1,而a1 是表中第一個(gè)元素,它沒(méi)有前趨,an 是最后一個(gè)元素?zé)o后繼。
線性表的基本操作
在第一章中提到,數(shù)據(jù)結(jié)構(gòu)的運(yùn)算是定義在邏輯結(jié)構(gòu)層次上的,而運(yùn)算的具體實(shí)現(xiàn)是建立在存儲(chǔ)結(jié)構(gòu)上的,因此下面定義的線性表的基本運(yùn)算作為邏輯結(jié)構(gòu)的一部分,每一個(gè)操作的具體實(shí)現(xiàn)只有在確定了線性表的存儲(chǔ)結(jié)構(gòu)之后才能完成。
線性表上的基本操作有:
⑴ 線性表初始化:Init_List(L)
初始條件:表L不存在操作結(jié)果:構(gòu)造一個(gè)空的線性表
⑵ 求線性表的長(zhǎng)度:Length_List(L)
初始條件:表L存在
操作結(jié)果:返回線性表中的所含元素的個(gè)數(shù)
⑶ 取表元:Get_List(L,i)
初始條件:表L存在且1<=i<=Length_List(L)
操作結(jié)果:返回線性表L中的第i個(gè)元素的值或地址
⑷ 按值查找:Locate_List(L,x),x是給定的一個(gè)數(shù)據(jù)元素。
初始條件:線性表L存在
操作結(jié)果:在表L中查找值為x的數(shù)據(jù)元素,其結(jié)果返回在L中首次出現(xiàn)的值為x的那個(gè)元素的序號(hào)或地址,稱為查找成功; 否則,在L中未找到值為x的數(shù)據(jù)元素,返回一特殊值表示查找失敗。
⑸ 插入操作:Insert_List(L,i,x)
初始條件:線性表L存在,插入位置正確(1<=i<=n+1,n為插入前的表長(zhǎng))。
操作結(jié)果:在線性表L的第i 個(gè)位置上插入一個(gè)值為x 的新元素,這樣使原序號(hào)為i , i+1, ... , n 的數(shù)據(jù)元素的序號(hào)變?yōu)閕+1,i+2, ... , n+1,插入后表長(zhǎng)=原表長(zhǎng)+1。
⑹ 刪除操作:Delete_List(L,i)
初始條件:線性表L存在,1<=i<=n。
操作結(jié)果:在線性表L中刪除序號(hào)為i的數(shù)據(jù)元素,刪除后使序號(hào)為i+1, i+2,..., n的元素變?yōu)樾蛱?hào)為i, i+1,...,n-1,新表長(zhǎng)=原表長(zhǎng)-1。
線性表的順序存儲(chǔ)是指在內(nèi)存中用地址連續(xù)的一塊存儲(chǔ)空間順序存放線性表的各元素,用這種存儲(chǔ)形式存儲(chǔ)的線性表稱其為順序表。因?yàn)閮?nèi)存中的地址空間是線性的,因此,用物理上的相鄰實(shí)現(xiàn)數(shù)據(jù)元素之間的邏輯相鄰關(guān)系是既簡(jiǎn)單,又自然的。如圖2.1 所示。
設(shè)a1的存儲(chǔ)地址為L(zhǎng)oc(a1),每個(gè)數(shù)據(jù)元素占d個(gè)存儲(chǔ)地址,則第i個(gè)數(shù)據(jù)元素的地址為:
Loc(ai)=Loc(a1)+(i-1)*d 1<=i<=n
單鏈表
鏈表是通過(guò)一組任意的存儲(chǔ)單元來(lái)存儲(chǔ)線性表中的數(shù)據(jù)元素的,那么怎樣表示出數(shù)據(jù)元素之間的線性關(guān)系呢?為建立起數(shù)據(jù)元素之間的線性關(guān)系,對(duì)每個(gè)數(shù)據(jù)元素ai,除了存放數(shù)據(jù)元素的自身的信息ai 之外,還需要和ai一起存放其后繼ai+1 所在的存貯單元的地址,這兩部分信息組成一個(gè)“結(jié)點(diǎn)”,結(jié)點(diǎn)的結(jié)構(gòu)如圖2.6 所示,每個(gè)元素都如此。存放數(shù)據(jù)元素信息的稱為數(shù)據(jù)域,存放其后繼地址的稱為指針域。因此n個(gè)元素的線性表通過(guò)每個(gè)結(jié)點(diǎn)的指針域拉成了一個(gè)“鏈子”,稱之為鏈表。因?yàn)槊總€(gè)結(jié)點(diǎn)中只有一個(gè)指向后繼的指針,所以稱其為單鏈表。
鏈表是由一個(gè)個(gè)結(jié)點(diǎn)構(gòu)成的,結(jié)點(diǎn)定義如下:
typedef struct node
{ datatype data;
struct node *next;
} LNode,*LinkList;
定義頭指針變量:
LinkList H;
在鏈表的頭部插入結(jié)點(diǎn)建立單鏈表
鏈表與順序表不同,它是一種動(dòng)態(tài)管理的存儲(chǔ)結(jié)構(gòu),鏈表中的每個(gè)結(jié)點(diǎn)占用的存儲(chǔ)空間不是預(yù)先分配,而是運(yùn)行時(shí)系統(tǒng)根據(jù)需求而生成的,因此建立單鏈表從空表開(kāi)始,每讀入一個(gè)數(shù)據(jù)元素則申請(qǐng)一個(gè)結(jié)點(diǎn),然后插在鏈表的頭部,如圖2.10 展現(xiàn)了線性表:(25,45,18,76,29)之鏈表的建立過(guò)程,因?yàn)槭窃阪湵淼念^部插入,讀入數(shù)據(jù)的順序和線性表中的邏輯順序是相反的。
在單循環(huán)鏈表上的操作基本上與非循環(huán)鏈表相同,只是將原來(lái)判斷指針是否為NULL變?yōu)槭欠袷穷^指針而已,沒(méi)有其它較大的變化。
下面先請(qǐng)看圖2.22 ,在圖2.22中,規(guī)模較大的結(jié)構(gòu)數(shù)組sd[MAXSIZE] 中有兩個(gè)鏈表: 其中鏈表SL是一個(gè)帶頭結(jié)點(diǎn)的單鏈表,表示了線性表(a1, a2, a3, a4, a5),而另一個(gè)單鏈表AV是將當(dāng)前sd 中的空結(jié)點(diǎn)組成的鏈表。
總結(jié)
以上是生活随笔為你收集整理的c语言数据结构系统化,C语言数据结构+数据库+操作系统的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Xv6 编写用户程序
- 下一篇: 【xv6 RISC-V】xv6操作系统原