1. 程式人生 > 其它 >List連結串列的基本功能結構體實現

List連結串列的基本功能結構體實現

這裡直接以插入排序歸併排序的程式碼來介紹單向連結串列:

 1 //結構體實現連結串列 插入排序
 2 struct Node{
 3     int value;
 4     Node *next;
 5     //Node *prev;            //雙向連結串列
 6     Node *head = NULL;         //NULL表示一個空節點,實際上是一個定義在標準庫中值為0的常量
 7 } a[1001],*head;
 8 
 9 //在p節點後插入now節點
10 void Insert(Node *p,Node *now){
11     now->next = p->next;
12 p->next = now; 13 return; 14 } 15 //刪除now節點 16 void Delete(Node *p,Node *now){ 17 p->next = now->next; 18 now->next = NULL; //這句可以不寫 19 return; 20 } 21 22 int main(){ 23 ios; 24 int n; 25 cin >> n; 26 for (int i = 1; i <= n; i++){ 27 cin >> a[i].value;
28 if (head == NULL || a[i].value < head->value){ 29 a[i].next = head; 30 head = &a[i]; 31 } 32 else{ 33 for (Node *p = head; p != NULL ; p = p->next){ 34 if (p->value < a[i].value && (p->next == NULL || a[i].value < p->next->value)){
35 Insert(p,&a[i]); 36 break; 37 } 38 } 39 } 40 } 41 for (Node *p = head;p;p = p->next){ 42 cout << p->value << " "; 43 } 44 return 0; 45 }
 1 //歸併排序
 2 struct Node{
 3     int value;
 4     Node *next;
 5 } a[100001],b[100001],*h1,*h2;
 6 
 7 int n,m;
 8 
 9 Node *Merge(Node *h1, Node *h2){
10     Node *p1 = h1, *p2 = h2;
11     Node *ans = NULL, *t = NULL;
12     while(p1 || p2){
13         if (p1 && (p2 == NULL || p1->value < p2->value)){
14             if (ans == NULL){
15                 ans = t = p1;
16             }
17             else{
18                 t->next = p1;
19                 t = p1;
20             }
21             p1 = p1->next;
22         }
23         else{
24             if (ans == NULL){
25                 ans = t = p2;
26             }
27             else{
28                 t->next = p2;
29                 t = p2;
30             }
31             p2 = p2->next;
32         }
33     }
34     return ans;
35 }
36 
37 
38 int main(){
39     //ios;
40     cin >> n >> m;
41     h1 = h2 = NULL;
42     Node *t1 = NULL;
43     Node *t2 = NULL;
44     for (int i = 1;i <= n;i++){
45         cin >> a[i].value;
46         if (h1 == NULL){
47             h1 = &a[i];
48             t1 = &a[i];
49         }
50         else{
51             t1->next = &a[i];
52             t1 = &a[i];
53         }
54     }
55     for (int i = 1;i <= m;i++){
56         cin >> b[i].value;
57         if (h2 == NULL){
58             h2 = &b[i];
59             t2 = &b[i];
60         }
61         else{
62             t2->next = &b[i];
63             t2 = &b[i];
64         }
65     }
66     Node *p = Merge(h1,h2);
67     for (; p; p = p->next){
68         cout << p->value << " ";
69     }
70     return 0;
71 }

雙向連結串列:

 

 1 //結構體實現雙向連結串列
 2 struct Node{
 3     int value;
 4     Node *next;
 5     Node *prev;
 6     Node *head = NULL;
 7 } a[1001],*head;
 8 
 9 
10 void Insert(Node *p, Node now){
11     //在頭尾插入需要特判 這裡沒有給出
12     Node *q = p->next;
13     p->next = now;
14     now->prev = p;
15     now->next = q;
16     q->prev = now;
17     return;
18 }
19 
20 void Delete(Node *now){
21     //當now為head || tail的時候需要特判 這裡也沒有給出
22     Node *p = now->prev, *q = now->next;
23     p->next = q;
24     q->prev = p;
25     return;
26 }

 

迴圈連結串列其實就是在單向列表的基礎上 將最後一個節點的next指標指向頭節點(雙向同理)。

在此處就不做程式碼解釋了。

還有一些例如鄰接連結串列之類的其他種類的連結串列,由於不太常用就先寫了(才不是因為懶)

STL方法也一併給出:

 1 list.begin() //返回指向第一個元素的iterator
 2 list.end()   //返回指向最末元素的下一個位置的iterator
 3 list.empty() //空則1
 4 list.size()
 5 list.insert(pos[k],1)//插入到迭代器pos[k]的左邊 返回一個迭代器
 6 list.erase()
 7 list.sort()
 8 list.reverse()
 9 list.remove()//刪除具有指定值的元素
10 list.push_front(1);//從前面插入1

詳情可見:<list> - C++ Reference (cplusplus.com)