List連結串列的基本功能結構體實現
阿新 • • 發佈:2022-04-01
這裡直接以插入排序和歸併排序的程式碼來介紹單向連結串列:
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)