(1)資料結構,顧名思義,資料的結構,而如何將資料組合成一種結構了,c語言裡用到了struct結構體型別、union聯合體型別、enum列舉型別這三種。
struct結構體型別,顧名思義,是一種結構,一種由基本資料型別(int、char、double、float等等)組合而成的乙個整體,至於如何組合,很簡單。
如:struct 結構體名字
;//不要忘記末尾加分號
結構體名字就是變數名,遵循命名規則,這樣就定義了乙個結構體型別!注意,是定義了一種型別!這種型別和基本資料型別是沒有任何區別的,都是資料型別!都是可以用來定義變數的!
結構體型別定義變數的方式:
【struct 結構體名字 變數名;】
這樣就定義了乙個某某結構體的變數了,若是如此:
【struct 結構體名字* 變數名;】
這樣就定義了乙個某某結構體變數的指標了。
注意:c語言的結構體型別是【struct 結構體名字】,記住,這是兩個單詞組合起來作為乙個型別名稱使用的!這個的乙個整體就等價於整型的int這個符號。以後不論任何時候使用到結構體型別,都必須是【struct 結構體名字】這種方式。
如:某某結構體指標型別【struct 結構體名字*】,這裡多了個*解引用運算子,用來表示指標。
如:struct mystructname
;//不要忘記末尾加分號
這裡在mystructname結構體中定義乙個mystructname結構體的指標,但注意,這裡不能定義mystructname結構體的變數,因為mystructname結構體其實還沒定義,只是被宣告了,只有在分號結束後才定義了mystructname結構體。
而且,反證法,若是mystructname結構體內部定義了乙個mystructname的結構體變數,顯然sizeof(struct mystructname)時候,這裡的sizeof是在編譯時候就獲得結果大小的函式,sizeof去獲取mystructname結構體的大小,但是mystructname結構體的裡面還有mystructname結構體大小,怎麼辦?死迴圈唄!掛掉了!
而若是mystructname結構體裡面定義mystructname結構體指標,不論任何指標都只有32位的,所以sizeof是有效的。
如,定義乙個鍊錶,顯然需要兩個結構體,鍊錶描述需要乙個,鍊錶節點需要乙個:
struct mylistnode
;struct mylist
;這兩個結構體定義就能夠組合成乙個鍊錶,若是加上一些操作鍊錶的函式,就成為了乙個資料結構。簡單吧!老婆。
注:鍊錶不可能是連續分配的記憶體,所以鍊錶使用的記憶體必須是malloc分配的堆記憶體,也就是由程式設計師自己管理,只要能夠索引到對應的記憶體指標,就能獲取對應的資料。
注:鍊錶,生動地來說,就像無數條鍊子鏈結起來的一塊塊記憶體,可能這塊內存在這裡,可能那塊記憶體在那裡,記憶體位置是不確定的,但所有的記憶體必然有且至少有乙個指標指向它!而這些記憶體就能夠存放資料了。
(2)union聯合體
聯合體,顧名思義是聯合起來的乙個整體,如何聯合起來呢?就是記憶體空間聯合起來!也就是一段記憶體空間,可以存放聯合體中所定義的任何型別資料。
注:聯合體的宣告和定義和結構體的宣告定義是一樣的,但是對聯合體的解釋是不同的。
如:union 聯合體名字
;//不要忘記分號
這個聯合體的記憶體只會分配其成員中,占用記憶體最大的記憶體數量的記憶體空間!這裡是double占用空間最大,有8個位元組,所以這個聯合體只佔8個位元組!
而且聯合體的值,每一次對其成員進行賦值,都會改變所有成員的值,如:
【union 聯合體名字 myunion; myunion.ma = 10; myunion.mb = 20;】
這裡在第一次賦值為10之後,不論是mb、mc或md都是10,直到第二次賦值為20,那麼不論是ma、mb、mc或md都是20。也就是同一時間,聯合體只能儲存乙個值!
(3)enum列舉型別
列舉型別,顧名思義,列舉,就是所有值都列舉出來!所以其宣告定義如下:
enum
;列舉型別裡的成員必定是乙個名字,且這個名字代表著某個值,若是沒有被賦值,就會預設賦值給前乙個名字數值的加一,如第乙個enum_name1沒有賦值,預設值為0,enum_name2就是「0+1」,enum_name3就是「1+1」,這裡的enum_name2和enum_name3並不是簡單的1和2,其值和名字是作為乙個唯一標識,作為列舉的乙個成員。
這裡的值可以重複的,如:
enum
;很顯然,enum_name2的值就是「1+1」,看起來字面上是2,且和enum_name3重複,但真正的值並不是2,而是「1+1」。
注:列舉型別裡的成員都是明確規定的值,這些值不管字面上表示如何,都絕對不會是相同的。而且列舉型別的成員的型別是獨有的,和其他基本資料型別不同。
(4)演算法,顧名思義,是計算的方法,計算的方式方案,怎麼計算就會有怎麼樣的方法,計算的過程就是這種方法,所以,計算的過程和得到結果就叫演算法!
如:【c = a+b;】這句語句也是演算法,計算過程是a+b,計算結果是c。
如:使用for迴圈遍歷乙個列表,這也是演算法,計算過程是使用for迴圈,計算結果就是「遍歷了列表」
如:用二分搜尋的方法搜尋一組資料,這也是演算法,計算過程是使用二分搜尋,搜到的結果是所需要的某個值。
演算法,其實任何語句都是乙個演算法,只是有難易的區分而已。
一般常用的演算法有:用於排序的氣泡排序、插入排序、快速排序這些,用於搜尋某個值的二分搜尋、遞迴搜尋、雜湊搜尋、二叉樹等等
c語言標準庫提供有一些演算法函式,如快速排序演算法qsort;
void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));
base
表示傳入的陣列,
nelem
表示陣列大小,
width
表示陣列每個資料所佔的位元組數
fcmp
是用於比較的函式指標,用於確定排序順序。
資料結構和演算法 C語言
鍊錶的基本操作 作用 鍊錶的基本操作和將鍊錶逆置功能 include stdio.h include string.h include stdlib.h typedef struct linknodelinknode 從鍵盤中輸入資料,然後建立成煉表 linknode creat slist lin...
C語言資料結構1 資料結構和演算法
如果沒有接觸過資料結構這門課程,或者說只是單單聽過這個名詞。那麼在含義方面,資料結構對於我們來說是非常陌生的。在了解一門課程之前,我們總是要知道這門課程要學習什麼。在了解資料結構之前,我們需要知道什麼是資料。對於人類來說,一切可以讓我們獲取資訊的東西都是資料。我們可以通過乙個動物的叫聲判斷是什麼動物...
C語言資料結構 六 ,串
c語言資料結構 嚴蔚敏,吳偉民版。以下內容為串 串或字串 sting 由零個或者多個字元組成的有限序列。串長度 串中字元的數目n,稱為串的長度。空串 零個字元的串。子串 串中任意個連續的字元組成的子串行。主串 包含子串的的串。空格串 blank string 由乙個或多個空格組成的串。串的抽象資料型...