當前位置:首頁 » 編程語言 » c語言鏈表支持隨機存取嗎
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言鏈表支持隨機存取嗎

發布時間: 2022-06-07 15:57:37

c語言中 的鏈表

鏈表是線形表的一種,線形表分為順序存儲結構和鏈式存儲結構。線形表的順序存儲結構的特點是邏輯關繫上相鄰的兩個元素物理位置上也相鄰,因此可以隨機存取表中任一元素。鏈式存儲結構的特點是用一組任意的存儲單元存儲線形表的數據元素。
插入和刪除指的是對鏈表中數據元素的基本操作。
建議你看看《數據結構(c語言版)》,上面說的非常詳細。

㈡ 線性鏈表不能隨機存取元素的原因

如果明白線性鏈表的原理,自然就知道為什麼不能隨機存取。
先舉栗子:
線性鏈表:
存儲地址(物理) 0x11 0x52 0x02 0xe3
存放元素(邏輯) a-> b-> c-> d

如上,線性鏈表就是一組前元素後面有可能拖著一個元素的數據結構。線性鏈表所存放的元素在物理空間上一般不是相鄰的,他們只具有邏輯上相鄰的關系,因此你只能通過前一個元素與後一個元素之間的關系找到後一個元素,而這個關系就是你在前一個元素中存放的後一個元素的地址。

跟生活中比較相似的事物結合,如一串佛珠、手鏈,柱子是一顆顆串起來的,珠子就像是鏈表中的元素,把珠子串起來的線就是他們之間的邏輯關系,記住只是邏輯關系而不是物理關系。只要在邏輯上符合就是線性表,跟物理結構沒有關。

與數組比較,數組是隨機存儲結構,那麼為什麼數組能隨機存取呢?因為數組是一塊物理上相連的存儲空間,只要知道該數組的首元素的地址,之後的元素在此基礎上加位置號,就可以找到想要的元素,這就是隨機存取,不需要先找a,再找b,最後找到c,而是直接0x10(數組開始位置)+2 就是c元素。
線性表通常沒有這種物理上的關系,因此只能根據前面元素給的線索一個個去找。
能直接找到的叫做隨機存取,不能一下找到的就不是。

㈢ C語言鏈表與隊列的問題

首先:鏈表與隊列都是數據結構的一種
一.
鏈表
1.定義

鏈表(Linked
list)是一種常見的基礎數據結構,是一種線性表,但是並不會按線性的順序存儲數據,而是在由一個個節點組成,每個節點(node)中儲存著數據變數(data)和指針變數(node
next),又有一個頭節點(head)連接下面的節點,而最後一個節點指向空(null)。可以在鏈表類中定義增加,刪除,插入,遍歷,修改等方法,故常用來儲存數據。

2.
優點

(1).使用鏈表結構可以克服數組鏈表需要預先知道數據大小的缺點,鏈表結構可以充分利用計算機內存空間,實現靈活的內存動態管理。

(2).數據的存取往往要在不同的排列順序中轉換,而鏈表是一種自我指示數據類型,因為它包含指向另一個相同類型的數據的指針(鏈接)。鏈表允許插入和移除表上任意位置上的節點,但是不允許隨機存取。

3.
缺點

鏈表失去了數組隨機讀取的優點,同時鏈表由於增加了結點的指針域,空間開銷比較大。

4.
類型

主要有單向鏈表,雙向鏈表以及循環鏈表。

5.
實例

6.
與數組(Array)的對比

鏈表的使用不需要知道數據的大小,而數組在創建時必須指明數組的大小。

鏈表沒有對應的下標,只有指向下一個數據的指針,而數組中每一個都有一個相對應的下標。

鏈表在內存中儲存的數據可以是不連續的,而數組儲存的數據占內存中連續的一段,用標識符標識。
二.
隊列
1.
定義

隊列是一種特殊的線性表,它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。隊列中沒有元素時,稱為空隊列。

在隊列這種數據結構中,最先插入的元素將是最先被刪除的元素;反之最後插入的元素將最後被刪除的元素,因此隊列又稱為「先進先出」(FIFO—first
in
first
out)的線性表。

㈣ 鏈表是順序存儲,數組是隨機存儲這句話對嗎

錯~
剛好反了~
鏈表是隨機存儲的,即有需要新建結點時,才新建結點。因此存儲的位置是不連續的。
數組是順序存儲的。數組實際上是直接開辟一片內存作為存儲空間~

㈤ c語言 鏈表是什麼。書上的沒看太懂

由於不必須按順序存儲,鏈表在插入的時候可以達到O(1)的復雜度,比另一種線性表:順序錶快得多,但是查找一個節點或者訪問特定編號的節點則需要O(n)的時間,而順序表相應的時間復雜度分別是O(logn)和O(1)。使用鏈表結構可以克服數組鏈表需要預先知道數據大小的缺點,鏈表結構可以充分利用計算機內存空間,實現靈活的內存動態管理。但是鏈表失去了數組隨機讀取的優點,同時鏈表由於增加了結點的指針域,空間開銷比較大。在計算機科學中,鏈表作為一種基礎的數據結構可以用來生成其它類型的數據結構。鏈表通常由一連串節點組成,每個節點包含任意的實例數據(data fields)和一或兩個用來指向明上一個/或下一個節點的位置的鏈接("links")。鏈表最明顯的好處就是,常規數組排列關聯項目的方式可能不同於這些數據項目在記憶體或磁碟上順序,數據的存取往往要在不同的排列順序中轉換。而鏈表是一種自我指示數據類型,因為它包含指向另一個相同類型的數據的指針(鏈接)。鏈表允許插入和移除表上任意位置上的節點,[1]但是不允許隨機存取。鏈表有很多種不同的類型:單向鏈表,雙向鏈表以及循環鏈表。鏈表可以在多種編程語言中實現。像Lisp和Scheme這樣的語言的內建數據類型中就包含了鏈表的存取和操作。程序語言或面向對象語言,如C,C++和Java依靠易變工具來生成鏈表。 [編輯本段]特點 線性表的鏈式存儲表示的特點是用一組任意的存儲單元存儲線性表的數據元素(這組存儲單元可以是連續的,也可以是不連續的)。因此,為了表示每個數據元素 與其直接後繼數據元素 之間的邏輯關系,對數據元素 來說,除了存儲其本身的信息之外,還需存儲一個指示其直接後繼的信息(即直接後繼的存儲位置)。由這兩部分信息組成一個"結點"(如概述旁的圖所示),表示線性表中一個數據元素 。 [編輯本段]擴展 根據情況,也可以自己設計鏈表的其它擴展。但是一般不會在邊上附加數據,因為鏈表的點和邊基本上是一一對應的(除了第一個或者最後一個節點,但是也不會產生特殊情況)。不過有一個特例是如果鏈表支持在鏈表的一段中把前和後指針反向,反向標記加在邊上可能會更方便。 對於非線性的鏈表,可以參見相關的其他數據結構,例如樹、圖。另外有一種基於多個線性鏈表的數據結構:跳錶,插入、刪除和查找等基本操作的速度可以達到O(nlogn),和平衡二叉樹一樣。 其中存儲數據元素信息的域稱作數據域(設域名為data),存儲直接後繼存儲位置的域稱為指針域(設域名為next)。指針域中存儲的信息又稱做指針或鏈。 由分別表示,,…, 的N 個結點依次相鏈構成的鏈表,稱為線性表的鏈式存儲表示,由於此類鏈表的每個結點中只包含一個指針域,故又稱單鏈表或線性鏈表. [編輯本段]三個鏈表函數(C語言描述) #include #include struct Node{ int data;//數據域 struct Node * next;//指針域 }; /************************************************************************************** *函數名稱:insert *函數功能:在鏈表中插入元素. *輸入:head 鏈表頭指針,p新元素插入位置,x 新元素中的數據域內容 *輸出:無 *************************************************************************************/ void insert(Node * head,int p,int x){ Node * tmp = head; for(int i = 0;inext; if(tmp == NULL) return ; } Node * tmp2 = new Node; tmp2->data = x; tmp2->next = tmp->next; tmp->next = tmp2; } /************************************************************************************** *函數名稱:del *函數功能:刪除鏈表中的元素 *輸入:head 鏈表頭指針,p 被刪除元素位置 輸出:被刪除元素中的數據域.如果刪除失敗返回-1 **************************************************************************************/ int del(Node * head,int p){ Node * tmp = head; for(int i = 0;inext; if(tmp == NULL) return -1; } int ret = tmp->next->data; tmp->next = tmp->next->next; return ret; } void print(Node *head,Node * root){ for(Node *tmp = head; tmp!=NULL; tmp = tmp->next) printf("%d ",tmp->data); printf("\n"); } int main(){ Node * head; head = new Node; head->data = -1; head->next=NULL; return 0; } [編輯本段]結語 C語言是學習數據結構的很好的學習工具。理解了C中用結構體描述數據結構,那麼對於理解其C++描述,Java描述都就輕而易舉了! [編輯本段]兩種鏈表形式 一、循環鏈表 循環鏈表是與單鏈表一樣,是一種鏈式的存儲結構,所不同的是,循環鏈表的最後一個結點的指針是指向該循環鏈表的第一個結點或者表頭結點,從而構成一個環形的鏈。 循環鏈表的運算與單鏈表的運算基本一致。所不同的有以下幾點: 1、在建立一個循環鏈表時,必須使其最後一個結點的指針指向表頭結點,而不是象單鏈表那樣置為NULL。此種情況還使用於在最後一個結點後插入一個新的結點。 2、在判斷是否到表尾時,是判斷該結點鏈域的值是否是表頭結點,當鏈域值等於表頭指針時,說明已到表尾。而非象單鏈表那樣判斷鏈域值是否為NULL。 二、雙向鏈表 雙向鏈表其實是單鏈表的改進。 當我們對單鏈表進行操作時,有時你要對某個結點的直接前驅進行操作時,又必須從表頭開始查找。這是由單鏈表結點的結構所限制的。因為單鏈表每個結點只有一個存儲直接後繼結點地址的鏈域,那麼能不能定義一個既有存儲直接後繼結點地址的鏈域,又有存儲直接前驅結點地址的鏈域的這樣一個雙鏈域結點結構呢?這就是雙向鏈表。 在雙向鏈表中,結點除含有數據域外,還有兩個鏈域,一個存儲直接後繼結點地址,一般稱之為右鏈域;一個存儲直接前驅結點地址,一般稱之為左鏈域。

㈥ 求大大們具體描述下C語言中的結構體和鏈表(最好能用圖表描述)

1)簡單的來說,結構體就是一個可以包含不同數據類型的一個結構,它是一種可以自己定義的數據類型,它的特點和數組主要有兩點不同,首先結構體可以在一個結構中聲明不同的數據類型,第二相同結構的結構體變數是可以相互賦值的,而數組是做不到的,因為數組是單一數據類型的數據集合,它本身不是數據類型(而結構體是),數組名稱是常量指針,所以不可以做為左值進行運算,所以數組之間就不能通過數組名稱相互復制了,即使數據類型和數組大小完全相同。
定義結構體使用struct修飾符,例如:
struct test
{
float a;
int b;
};
2)鏈表(Linked list)是一種常見的基礎數據結構,是一種線性表,但是並不會按線性的順序存儲數據,而是在每一個節點里存到下一個節點的指針(Pointer)。由於不必須按順序存儲,鏈表在插入的時候可以達到O(1)的復雜度,比另一種線性表順序錶快得多,但是查找一個節點或者訪問特定編號的節點則需要O(n)的時間,而順序表相應的時間復雜度分別是O(logn)和O(1)。
在計算機科學中,鏈表作為一種基礎的數據結構可以用來生成其它類型的數據結構。鏈表通常由一連串節點組成,每個節點包含任意的實例數據(data fields)和一或兩個用來指向明上一個/或下一個節點的位置的鏈接("links")。鏈表最明顯的好處就是,常規數組排列關聯項目的方式可能不同於這些數據項目在記憶體或磁碟上順序,數據的訪問往往要在不同的排列順序中轉換。而鏈表是一種自我指示數據類型,因為它包含指向另一個相同類型的數據的指針(鏈接)。鏈表允許插入和移除表上任意位置上的節點,但是不允許隨機存取。鏈表有很多種不同的類型:單向鏈表,雙向鏈表以及循環鏈表。

㈦ 鏈表哪一種可以隨機存取

鏈表都不可以可以隨機存取的,鏈表都是只能順序存取的。

㈧ 關於C語言中,鏈表的文件儲存方式

思路1是可行的,但思路2大多情況下是不可行的,因為鏈表是動態申請內存空間的,並且地址(理論上是隨機的)不確定,你用數據塊來讀寫,這不就等於原先隨機生產的指針地址都拿過來了?(如果釋放了鏈表的內存,被其它給佔用了該內存點,你的程序大多情況下會漰掉的)

思路2的可行情況:
1.原先申請的內存不能釋放,並且還在一起(當然程序也不可以關閉),保存文件等於沒啥用處
2.在讀取文件後,重置一下指向指針的地址!...

㈨ C語言基礎知識中:線性表的順序、鏈式存儲結構分別是:隨機存取和順序存取結構對嗎

不對,數組是隨機存取,所有的線性表都是順序存取結構。你想想,我要找第5個元素,用數組直接 A[4] 就找到了,而線性表就要從「頭」元素開始一個一個地往後遍歷,直到需要的那個,隨機不了。

㈩ c語言,什麼是鏈表,一般都是拿鏈表和數組相比較,數組是一種數據構造類型,那麼鏈表也是嗎資料上說鏈

首先數組和鏈表都是描述常用的數據結構的數據存儲方式!兩者在內存中最大的區別是:數組是連續的內存空間;鏈表對應的數據實體的內存空間可以不連續,而且鏈表一般用結構體來實現!他們的共同點是都和指針相關,特別是鏈表,必須有堅實的指針基礎才能更好的理解!鏈表是數據結構中樹,圖等結構的最常用的表示方法