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