鏈表是一種常見的重要的資料結構,他的特點是動態地進行儲存分配。
1.鏈表有哪些優勢。
舉個栗子:如果事先不知道不知道要存放的資料的長度,就要把數組定的足夠大。如果要用同一個數組存放不同長度的資料時,就要選擇資料長度最長的那個作為數組的長度。鏈表能夠比較好的解決這兩種情況。
2.什麼是鏈表。
鏈表有一個“頭指標”,它指向一個元素,這個元素在鏈表中被稱為“結點”,而每一個“結點”應該包含兩個部分:使用者需要的資料和下一個結點的地址(指標)。這樣結點與結點相互串連之後知道最後一個“表尾”,他的指向下個結點的地址(指標)為NULL。至此,鏈表結束。
3.鏈表中存放的地址是不連續的。
想要訪問一個鏈表,必須知道鏈表的“頭指標”。
4.如何建立一個鏈表。
用結構體變數建立鏈表最為合適。
struct ListNode{int value;struct ListNode*next;};
ListNode結構體成員中的 next指標是一個結構體指標,指向的還是struct ListNode類型的資料,所以利用這種方法建立鏈表。
5.如何建立靜態鏈表
#include<iostream>using namespace std;struct ListNode{int value;struct ListNode*next;}; int main(){ struct ListNode a,b,c,*head,*p; a.value = 1; b.value = 2; c.value = 3; head = &a; a.next = &b; b.next = &c; c.next = NULL; p = head; do {printf("%d\n",p->value); p = p->next; } while (p!= NULL); getchar(); return 0;}
程式用結構體變數a,b,c構成一個靜態鏈表,如代碼:
head = &a; a.next = &b; b.next = &c; c.next = NULL;
將鏈表的“頭指標”head賦值給指標p,其中head指向的結構體變數a的首地址,再用p輸出這個鏈表中的實際資料。所以,一個鏈表可以用一個指向其首地址的指標(頭指標)表示。
此外,我們可以把程式修改一下,將鏈表的建立與列印寫成獨立的函數:
#include<iostream>using namespace std;struct ListNode{int value;ListNode *next;};void showList(ListNode * L);void CreateList(ListNode * L,int n);int main(){ ListNode * L = new ListNode; L->next = nullptr; CreateList(L,5); showList(L); getchar(); getchar(); return 0;}void showList(ListNode * L){ ListNode * p = L; while (p) { cout<<p->value<<' '; p = p->next; } cout<<endl;}void CreateList(ListNode * L,int n){ cin>>L->value;//輸入第一個結點的資料值 n--; for (int i = 0; i < n; i++) { ListNode * p = new ListNode; cin>>p->value; p->next = nullptr; L->next = p; L = p; }}