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)

 

posted @ 2022-04-01 16:08  Conqueror712  阅读(65)  评论(0)    收藏  举报