C语言 链表输入输出数组
1.鏈表概念
????????鏈表是一種物理存儲單元上非連續、非順序的存儲結構,數據元素的邏輯順序是通過鏈表中的指針鏈接次序實現的。鏈表由一系列結點(鏈表中每一個元素稱為結點)組成,結點可以在運行時動態生成。每個結點包括兩個部分:一個是存儲數據元素的數據域,另一個是存儲下一個結點地址的指針域。?相比于線性表順序結構,操作。????? ? ? ?????
特征?
- 由于鏈表的內存空間是零散的,所以不支持隨機訪問。
- 插入、刪除不需要移動數據,所以效率高。
- 因為鏈表的每個內存塊都不是連續的,所以不需要提前計算內存的大小,內存空間可以根據結點數量的改變而改變。
圖解如下:?
2.鏈表與數組的不同
?????????鏈表與數組不一樣,鏈表的儲存空間不是連續的,是通過指針指向下一個節點,進行訪問,這也說明了鏈表訪問是有順序的, 必須先從頭開始,再依次找到想要訪問的數據節點。而數組不一樣,數組的空間是連續的,我們可以直接去訪問某一個數組的數據(比如直接輸出a[4]的值)。鏈表的存儲空間是動態空間,我們可以自行的刪減空間,可以隨意改動空間;數組的空間是固定的,這也說明了數組的數據空間是不可以隨意去改動。
3.輸入輸出數組
(1)數組輸入輸出
#include<stdio.h> int main() {int a[100];int n;scanf("%d", &n);for (int i = 0; i < n; i++)scanf("%d", &a[i]);for (int i = 0; i < n; i++)printf("%d ", a[i]); }可以看出用數組直接輸入輸出是很簡單的,但是我初始的空間是100個(sizeof(int)),這個空間是固定的,而且我輸入輸出的數字個數所占用的空間必須在這范圍內,否則會報錯,造成空間溢出。那么如果用鏈表去輸入輸出就會更加靈活,我們需要多少空間可以自行開辟,隨取隨用。
(2)鏈表的輸入輸出
#include<stdio.h> #include<malloc.h> struct node//先定義一個結構體,里面包含數據與結構體指針 {int data;struct node* next; }; int main() {struct node* head, * tail, * p;head = (struct node*)malloc(sizeof(struct node));//先在頭指針開辟一個存儲空間,但是不儲存數據head->data = 9;head->next = NULL;//初始化頭指針指向空指針tail = NULL;//尾指針初始化為空指針int x;int n;scanf("%d", &n);//輸入想要的數字n個int i = 0;//輸入數組while (i<n){p = (struct node*)malloc(sizeof(struct node));scanf("%d", &x);p->data = x;p->next = NULL;//p的指向下一個指針為空指針if (head->next == NULL)head->next = p;//固定頭指針指向的指針,然后保持不變elsetail->next = p;//此時的空間是新開辟的空間,tail->next即是上一個空間p->nexttail = p;//為指針指向p,可以理解作為一個橋梁,用來儲存是一個指向的空間i++;}//輸出數組int j;for (j = 0, p = head->next; j < n; p = p->next,j++)printf("%d ", p->data);return 0; }這里我們不難看出用鏈表輸入輸出一個數組需要的代碼量是非常大的。但是如果對于大數據的輸入輸出的話我們可以通過改變結構體的成員(即數據域)來照常輸入輸出,實際上鏈表的代碼量并沒有增加多少;如果用數組去輸入輸出大數據的話,那增加的代碼量是翻倍的增加,由此,可以體現出鏈表的優勢?。
總結:
數組優于鏈表的:?
1.內存空間占用的少,因為鏈表節點會附加上一塊或兩塊下一個節點的信息.但是數組在建立時就固定了.所以也有可能會因為建立的數組過大或不足引起內存上的問題.?
2.數組內的數據可隨機訪問.但鏈表不具備隨機訪問性.這個很容易理解.數組在內存里是連續的空間.比如如果一個數組地址從100到200,且每個元素占用兩個字節,那么100-200之間的任何一個偶數都是數組元素的地址.可以直接訪問.鏈表在內存地址可能是分散的.所以必須通過上一節點中的信息找能找到下一個節點.?
3.查找速度上.這個也是因為內存地址的連續性的問題.不羅索了.?
鏈表優于數組的:?
1.插入與刪除的操作.如果數組的中間插入一個元素,那么這個元素后的所有元素的內存地址都要往后移動.刪除的話同理.只有對數據的最后一個元素進行插入刪除操作時,才比較快.鏈表只需要更改有必要更改的節點內的節點信息就夠了.并不需要更改節點的內存地址.?
2.內存地址的利用率方面.不管你內存里還有多少空間,如果沒辦法一次性給出數組所需的要空間,那就會提示內存不足,磁盤空間整理的原因之一在這里.而鏈表可以是分散的空間地址.?
3.鏈表的擴展性比數組好.因為一個數組建立后所占用的空間大小就是固定的.如果滿了就沒法擴展.只能新建一個更大空間的數組.而鏈表不是固定的,可以很方便的擴展.
??????????????
總結
以上是生活随笔為你收集整理的C语言 链表输入输出数组的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OSG踩坑总结
- 下一篇: WSO2 WSF/CPP--WSDL简介