對於c語言而言,指標是其最精髓的重點內容,作為和計算機硬體最接近的部分,指標的靈活運用程度更是決定了c的使用生涯的高度。
上述均為廢話,主要是突出c指標的重要性-_-!今天咱們先不講指標的基礎知識點以及概念等內容,直接通過c指標簡單得到運用對其進行講解------單向鍊錶。之所以說單向鍊錶,那是因為c鍊錶結構還有其他種類,最少是有單向鍊錶肯定就有雙向鍊錶,下面進入主要內容...
鍊錶,從實現功能上來講,和陣列具有一定的相似性,肉眼上看儲存的內容都是儲存多條同結構的資料單元,以線性的表達形式表達。那實現的都是同樣的內容為什麼還要學習鍊錶,因為兩者還有最大的不同點,那就是對於計算機的記憶體而言,陣列儲存的資料單元相互之間在記憶體儲存空間上是連續的。原理就是,要通過陣列儲存資料時,先在記憶體上開闢一塊指定大小的空間,然後資料單元依次往裡填充,所以陣列成員之間在記憶體中也是相鄰儲存的。
對於鍊錶而言,如上述,實現結果相似,但是原理卻不同。那什麼是鍊錶,鍊錶的原理是什麼?鍊錶是c語言中一種常見的資料結構,實現功能和陣列相似,不同點就是鍊錶儲存的資料單元在記憶體空間上是非連續的,什麼意思,就是鍊錶儲存的資料,在現實輸出是是連續的,但是在計算機上最終的存在位置並不是連續的。舉乙個爛大街的例子,小朋友上幼兒園,大家放學牽手出校門的時候,每乙個小朋友都好比鍊錶中的乙個資料單元,小朋友在當前的表現形式是手牽手在一起,但是大家在世界上最終的存在空間並不是在一起的,不住在一條街上,放學後是要各回各家各找各媽的,自己的家才是自己在這個世界上最終的存在位置(鍊錶資料在記憶體中的位置),所以鍊錶資料的儲存位置是非連續的。
在鍊錶中有乙個頭指標,表示鍊錶的起點,頭指標指向第乙個節點;鍊錶中的節點共由兩部分組成,資料部分和指標部分,資料部分即節點儲存的資料,指標部分即下乙個節點的記憶體位址,指向下乙個元素。最後乙個元素指向null,表示其指向的位址為空。如下圖所示:
鍊錶,通過位址指向進行節點元素連線
在鍊錶這種資料結構中,必須利用指標才能實現。那麼如何實現乙個單向鍊錶?在實現鍊錶之前必須先介紹c語言與記憶體互動的幾個重點函式:
1、malloc函式
void *malloc(unsigned int size)
該函式的功能為在記憶體中動態的分配一塊size大小的記憶體,返回值為指標,即指向該分配的記憶體區域的位址。
2、calloc函式
void *calloc(unsigned n,unsigned size)
和malloc函式的功能類似,calloc函式的功能為在記憶體中申請分配n個長度為size的連續記憶體空間陣列,返回值為指向該空間的位址。
3、free函式
void free(*ptr)
此函式如單詞本意所表述一樣,即釋放此前申請的記憶體空間。
鍊錶的基本含義以及實現鍊錶要掌握的重點函式介紹如上述,建立鍊錶的
鍊錶有環問題
判斷乙個鍊錶是否有環 解析 如果鍊錶有環,則設定乙個指標,該指標會一直迴圈下去。我們可以設定兩個指標,乙個一次走一步,乙個一次走兩步,如果有環最終兩者會相遇,否則每次走兩步的指標最先走到鍊錶尾部。如下圖 延伸 判斷兩個鍊錶是否相交 給出兩個單向鍊錶的頭指標,比如l1,l2,判斷這倆個鍊錶是否相交。1...
有環單向鍊錶
1.給定單鏈表,檢測是否有環。如果有環,則求出進入環的第乙個節點。判斷單向鍊錶是否有環,可以採用快指標與慢指標的方式來解決。即定義乙個快指標fast和乙個慢指標slow,使得fast每次跳躍兩個節點,slow每次跳躍乙個節點。如果鍊錶沒有環的話,則slow與fast永遠不會相遇 這裡鍊錶至少有兩個節...
c語言鍊錶 鍊錶
在儲存一大波數的時候,我們通常使用陣列,但有時候陣列顯得不夠靈活,比如有一串已經從小到大排序好的數 2 3 5 8 9 10 18 26 32 現在需要往這串數中插入6使其得到的新序列仍符合從小到大排列。如果我們使用陣列來實現這一操作,則需要將8和8後面的數字都依次往後挪一位,如果你覺得這幾個數不算...