您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關C語言中鏈表與單鏈表有什么用,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
鏈表是一種介于數組的另外一種數據結構:
我們知道數組可以存放很多的元素,這些元素都是呈線性排列,也就是一個挨著一個連續存放
但是當元素足夠多時,還能繼續正常的存放嗎?
事實上的不可以的,雖然系統的內存足夠大,但是這些內存不都是連續的,這就導致會出現沒有足夠的空間去存儲這些元素。
其次就是數組的大小需要你去申請,如果你申請的空間足夠大,就會導致內存的浪費
而鏈表就很好的解決了這兩個問題
鏈表的作用就是相當與數組一樣,儲存你數據的
但又不同于數組,鏈表把每一個游離的數據進行連接,連接的方法通過的是指針,也就是地址,
每一個鏈表都是由一個個結點組成,結點包含,一個是為我們存放數據的空間,另一個是存放下一個結點地址的空間,也就是所謂的數據域和地址域。
鏈表有時候包括了頭結點,它是為了方便而設計的結點,這個頭結點一般只包含地址域,也就是結點1的地址,一般情況下,頭結點的數據域一般無意義。
最后的結點,指向的是NULL,用來限制鏈表的大小
說完鏈表的組成是結點,那單向鏈表的結點是如何定義的呢
struct Node //鏈表的結點 { int data; //結點的值 struct Node *next; //下一個結點的地址 };
//創建所需的結點 struct Node* createList(int n) { struct Node* first, * t, * last; int i; first = (struct Node*)malloc(sizeof(struct Node)); //給第一個結點數據賦個值 scanf_s("%d", &first->data); last = first ; //在創建其他的結點 for (i = n - 1; i > 0; i--) { //再首尾中間插入結點.并賦值 t= (struct Node*)malloc(sizeof(struct Node)); scanf_s("%d", &t->data); last->next = t; last=t; } last->next = NULL;//防止野指針的存在 return first; }
????其中的first,last,還有t,都是指針變量,用來存放各個節點的地址
sizeof(struct listnode)
函數返回結構體Node類型占用的字節數
malloc(sizeof(struct Node))
函數功能:系統從內存的空閑空間中,申請存放一個結點的存儲空間。
(struct listnode *)malloc(sizeof(struct Node))
,函數返回一個指針(地址),指向剛分配給結構體的第一個字節的地址。
malloc函數在頭文件stdlib.h中定義
//再創建函數進行打印出各個結點的值 void printList(struct Node* first) { //把每一個字節數據域的都打印出來 struct Node* p = first; while (p != NULL) { printf("%d ", p->data); p = p->next; } printf("\n"); }
其中傳入函數的是結構體指針
從第一個結點的數據域開始打印,到最后的NULL結束
(訪問下一個數據域不能用p++,因為鏈表不是連續的,地址也不是連續的,如果要訪問下一個數據,需要用p = p->next)
void destoryList(struct Node* first) { struct Node* p = first, *tmp; while (p != NULL) { tmp = p->next; free(p); p = tmp; } }
這里的 struct Node* p = first, *tmp;
就相當于 struct Node*p=first;
struct Node *tmp;
從鍵盤輸入一組整數,創建單向鏈表,并輸出鏈表中的數據。
樣例輸入:2 5 7 6 3 4
樣例輸出:2 5 7 6 3 4
解答如下:
#include<stdio.h> #include<stdlib.h> #define N 6 //鏈表 struct Node { int data; struct Node* next; }; //創建所需的結點 struct Node* createList(int n) { struct Node* first, * t, * last; int i; first = (struct Node*)malloc(sizeof(struct Node)); //給第一個結點數據賦個值 scanf_s("%d", &first->data); last = first ; //在創建其他的結點 for (i = n - 1; i > 0; i--) { //再首尾中間插入結點.并賦值 t= (struct Node*)malloc(sizeof(struct Node)); scanf_s("%d", &t->data); last->next = t; last=t; } last->next = NULL;//防止野指針的存在 return first; } //再創建函數進行打印出各個結點的值 void printList(struct Node* first) { //把每一個字節數據域的都打印出來 struct Node* p = first; while (p != NULL) { printf("%d ", p->data); p = p->next; } printf("\n"); } //釋放頭結點申請的空間 void destoryList(struct Node* first) { struct Node* p = first, *tmp; while (p != NULL) { tmp = p->next; free(p); p = tmp; } } int main() { struct Node* list; list = createList(N); printList(list);//輸出頭節點為list的鏈表 、、、、、、 destoryList(list); printf("\n"); return 0; }
關于“C語言中鏈表與單鏈表有什么用”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。