1. 程式人生 > >數據結構之鏈表

數據結構之鏈表

ret 需要 ror std 用戶輸入 用戶 存儲 足夠 存在

數據結構——鏈表

在c++中,數組對應著一個連續存儲的內存塊,將同類型的元素一個一個地排列起來,是組織數據的很好的方法。聲明數組的同時我們需要告訴編譯器數組的大小,以便開辟足夠大小的內存。但是,在解決實際問題時,元素的個數通常是不確定的,此時該如何聲明數組呢?接下來,我將講一下鏈表這個數據結構,它很好的解決了數組大小不易控制的問題。

技術分享

鏈表元素通常稱為鏈表結點,每個節點是一個結構體,包含數據域和指針域。指針域鏈接結點的下一個結點。如果將鏈表比作一串珠子,頭結點head就是繩頭,找珠子就要從頭結點開始,頭結點指向的結點1是鏈表的第一個數據結點。

提示:鏈表的存取 必須 從頭指針開始進行,最後一個結點的指針域為空(NULL);頭結點的數據域可以不包含任何信息,也可以存儲諸如元素個數等附加信息,或者幹脆用一個指針代替頭結點,如果鏈表為空,頭結點為空。

鏈表與結構數組存在很大差別

1:結構數組中的各元素是連續存放的,而鏈表中的結點可以不連續存放;

2:結構數組元素可以通過下標運算或相應指針變量的“移動”進行順序或隨機訪問;而鏈表中結點不便於隨機訪問,只能從頭結點一個一個的順序訪問。

3:結構數組在定義時就能確定其元素,不能動態增長,鏈表可以動態的增長。

下面是最簡單的一個結構體的示例

1 struct student
2 {
3     int score;
4     struct student*next;//指向另一個結構體的指針 
5 };

從內存申請結點空間的語句為:

head=(struct student*)malloc(sizeof(student));

下面是實現一個最簡單的動態單鏈表的源代碼

 1 #include <iostream>
 2 #include <stdlib.h>
 3 #include <string>
 4 using namespace std;
 5 //創建一個結構體 
 6 struct student
 7 {
 8     int score;
 9     struct student*next;//指向另一個結構體的指針 
10 };
11 struct student* List_create()
12 {
13     struct student *head;
14     struct
student *pnew=NULL;//創建的新結點的地址 15 struct student *tail=NULL;//原鏈最後一個結點的地址 16 17 head=(struct student*)malloc(sizeof(student)); 18 //良好的編程習慣,創建一個指針後轉而判斷該指針是否為空 19 if(head==NULL) 20 { 21 cout<<"cannot create it"; 22 } 23 24 head->next=NULL; 25 tail=head;//先將頭結點尾結點設置為一點 26 27 int s; 28 29 while(1) 30 { 31 cin>>s;//輸入數據 32 if(s)//當數據不為零 33 { 34 pnew=(struct student*)malloc(sizeof(student));//創建一個新結點 35 if(pnew==NULL) 36 { 37 cout<<" create error"; 38 } 39 pnew->score=s; 40 pnew->next= NULL; 41 42 tail->next=pnew;//將尾結點的指針指向新結點 43 tail=pnew;//將新結點設置為尾結點 44 } 45 else break; 46 } 47 //因為到目前為止head中並沒有數據,所以我們需要先將head設置為head->next,然後釋放 48 pnew=head 49 head=head->next; 50 51 free(pnew); 52 return head; 53 } 54 55 int main() 56 { 57 struct student*a=List_create(); 58 while(1) 59 { 60 if(a==NULL)break; 61 else 62 { 63 cout<<a->score<<endl; 64 a=a->next; 65 66 } 67 68 } 69 return 0; 70 }

代碼分析:首先用head指針動態申請內存創建一個頭結點,讓頭結點的指針域為NULL;而後在while結構中為實際數據申請內存創建結點,用指針pnew指向它,並將用戶輸入的數據放入該結點的數據域內,設置其指針為NULL,時刻保持尾結點tail指向鏈表尾部。最後修正head指針的位置,使其指向第一個數據結點。

數據結構之鏈表