* 朋友們若是覺得本教學對您有幫助,請點個讚~
串列(list):
為使用雙鍊結串列(double linked list)資料結構設計而成的容器。每個元素有其相對應的「節點」,節點之中儲存元素的值,還有兩個指標:指向上一個節點的記憶位址、下一個節點的記憶位址。串列中節點的記憶位址並不需要相鄰,在呼叫串列的某元素時,是從串列的第一個節點開始,一個節點一個節點的連接,因此無法用 串列名稱[n] 來呼叫序數為n的元素。以下是雙鍊結串列的示意圖:
1. 欲使用串列時,需在標頭檔內寫下#include <list>。
2.
(1) 串列的建構與向量、佇列同,如:list<int> a; 等等。
串列的元素,亦可以一般資料形態或物件(同樣,若是物件,則類別或結構應寫在主程式之前)。
(2) 串列迭代器的宣告與向量、佇列同,如:list<int>::iterator i; 等等。
串列迭代器必須使用i++的方式,跳到下一個元素位址。若是使用i=i+1;,因串列中元素未必各個相鄰,故可能造成錯誤。
(3) push_back、pop_back、begin、end、rbegin、rend、size、resize、clear、empty這些成員函式的用法皆同於向量(請看向量篇教學)。
3. 插入與移除元素:
bool even(int x)
{
if(x%2==0)return true;
else return false;
}
int main(int argc, char *argv[]) //主程式在此
{
int tt[9]={1,2,3,4,5,6,7,8,9};
list<int> a(tt,tt+9); //將tt中,「tt初始元素位置」到「初始後第九個元素位置」的元素都複製給a
list<int>::iterator I,j,k;
for(i=a.begin();i!=a.end();i++)
{cout<<*i<<",";}cout<<endl; //顯示:1,2,3,4,5,6,7,8,9,
[操作程式碼] //以下有說明
for(i=a.begin();i!=a.end();i++)
{cout<<*i<<",";}cout<<endl; //最終結果顯示
}
(1) 若[操作程式碼]為:串列名稱.remove(資料值),則會把串列中符合此值的資料都移除掉。如:a.remove(2);,最終結果顯示為1,3,4,5,6,7,8,9,
(2) 所謂「真假判斷式」,指的是回傳bool值的函式。若此回傳bool值的函式輸入參數只有一個,稱之為「單元判斷式」;若此回傳bool值的函式輸入參數有二個,稱之為「雙元判斷式」;以此類推。
若[操作程式碼]為:串列名稱.remove_if(單元判斷式名稱),則會把串列中的值代入此單元判斷式,符合此單元判斷式的資料都移除掉。如:a.remove_if(even);,最終結果顯示為1,3,5,7,9,
(3) 若[操作程式碼]為:串列名稱.erase(迭代器),則會把迭代器所指的元素給刪除,並回傳被移除元素後一個節點位址的迭代器。如:
j=a.begin();
j=j++;
a.erase(j);
最終結果顯示為:2,3,4,5,6,7,8,9,
(4) 若[操作程式碼]為:串列名稱.erase(迭代器1 , 迭代器2),則會把兩迭代器之間的元素給刪除,並回傳最後被移除元素之後一個節點位址的迭代器。如:j=a.begin();
j=j++;
k=a.end();
k--;
k--;
a.erase(j,k);
最終結果顯示為:8,9,
(5) 若[操作程式碼]為:串列名稱.insert(迭代器 , 值),則會在迭代器所指的位址上,加入此值元素,並回傳此新元素位址的迭代器。如:
j=a.begin();
j=j++;
a.insert(j,10);
最終結果顯示為:10,1,2,3,4,5,6,7,8,9,
(6) 若[操作程式碼]為:串列名稱.insert(迭代器 , 非負整數N , 值),則會在迭代器所指的位址上,加入N個此值元素。如:
j=a.begin();
j=j++;
a.insert(j,3,10);
最終結果顯示為:10,10,10,1,2,3,4,5,6,7,8,9,
(7) 若[操作程式碼]為:串列名稱.insert(迭代器1 , 迭代器2, 迭代器3),則會將該串列從迭代器2到迭代器3之間的元素複製並且插入迭代器1的位址。如:i=a.begin();
j=a.begin();
k=a.end();
i++; j++; j++; j++; k--;
a.insert(i,j,k);
最終結果顯示為:1,4,5,6,7,8,2,3,4,5,6,7,8,9,
評:因串列元素資料的記憶空間位址並非緊鄰,故不可用i=i+n(n為整數)來直接指定迭代器位址,而要靠i++或i--來逐項移動。
留言列表