首页 > 其他分享 >[cpp]: 双向链表的实现

[cpp]: 双向链表的实现

时间:2024-02-14 09:22:05浏览次数:21  
标签:data 链表 双向 cpp 链节 chains loop first

[cpp]:  双向链表的实现

 

 

 

 

一、思路或者原理

 

  1、双向链表的实现思路:

    1.1、链节(data class):【链节data】是组成【链条chains】的基本单元,【链节data】用于存储数据。

      1.1.1、链节内的数据成员:从当前【链节data】指向前一个【链节data】的指针(前向指针);从当前【链节data】指向后一个【链节data】的指针(后向指针);数据存储(保存数据)

      1.1.2、链节内的基本操作:【链节data】的赋值;

 

    1.2、实现双向链表(chains class):

      1.2.1、【链表chains】的基本操作:创建【链节data】并赋值;在两个【链节data】之间建立连接关系;删除【链节data】;遍历【链表chains】

      1.2.2、【链表chains】基本数据对象:first(指向【链表chains】的第一个【链节data】);  last(指向【链表chains】的最后一个【链节data】);

      1.2.3、(析构函数~chain())删除【链节data】。

 

 

 

 

二、程序代码

  1 #include <iostream>
  2 
  3 
  4 //  unit of chains
  5 class data
  6 {
  7 public:
  8 
  9     data() = delete ;
 10 
 11     ~data()
 12     {
 13         std::cout << "[~data]#\t" << --data::dsize << std::endl ;
 14     }
 15     data(int e):val(e)
 16     { 
 17         data::dsize++ ;
 18     }
 19 
 20     //  double chains
 21     data *pre = nullptr;
 22     data *next = nullptr;
 23 
 24     //  element of data
 25     int val = 0;
 26 
 27     //  count object of 'data' type
 28     static unsigned int dsize ;
 29 };
 30 
 31 //  initialize count of object of 'data' type
 32 unsigned int data::dsize = 0 ;
 33 
 34 
 35 //  chain_of_data
 36 class chains
 37 {
 38 private:
 39 
 40     //  head pointer of object of chain_data 'type'
 41     data *first = nullptr ;
 42 
 43     //  tail pointer of object of chain_data 'type'
 44     data *last = nullptr ;
 45 
 46 public:
 47 
 48     //  initialize object of 'chains' type.
 49     //  initialize first element of 'data' type.
 50     chains(int e) 
 51     {
 52         if ( first == nullptr  &&  last == nullptr )
 53         {
 54             data *node = new data(e) ;
 55             node->pre = nullptr ;
 56             first = node ;
 57             last = node ;
 58         }
 59     }
 60 
 61     ~chains()
 62     {
 63         for ( ; first != nullptr ;   )
 64         {
 65             data *keep = first ->next ;
 66             delete first ;
 67             first = keep;
 68             std::cout << "[~chains]#\t work over. " << std::endl ;
 69         }
 70     }
 71 
 72     //  set element of 'data' type.
 73     void set_chains(int e)
 74     {
 75         if ( first != nullptr  &&  last != nullptr )
 76         {
 77             data *keep_current = last ;
 78             data *node = new data(e) ;
 79             keep_current->next = node ;
 80             node->pre = keep_current ;
 81             node->next = nullptr ;
 82             last = node ;
 83         }
 84     }
 85 
 86     //  loop chains from begin to end.
 87     void loop_front_chains()
 88     {
 89         data *loop = nullptr ;
 90         if ( first != nullptr )
 91         {
 92             loop = first ;
 93             for ( ;  loop != nullptr ;  loop = loop->next )
 94             {
 95                 std::cout << "[loop_front]#\t" << loop->val << std::endl ;
 96             }
 97         }
 98     }
 99 
100     //  loop chains from end to begin.
101     void loop_back_chains()
102     {
103         data *loop = nullptr ;
104         if ( last != nullptr )
105         {
106             loop = last ;
107             for ( ;  loop != nullptr ;  loop = loop->pre )
108             {
109                 std::cout << "[loop_back]#\t" << loop->val << std::endl ;
110             }
111         }
112     }
113 };
114 
115 
116 int main()
117 {
118     chains g(0) ;
119     g.set_chains(1);
120     g.set_chains(2);
121     g.set_chains(3);
122     g.set_chains(4);
123     g.loop_front_chains() ;
124     g.loop_back_chains();
125 }

 

 

三、运行结果

 1 [loop_front]#    0
 2 [loop_front]#    1
 3 [loop_front]#    2
 4 [loop_front]#    3
 5 [loop_front]#    4
 6 [loop_back]#    4
 7 [loop_back]#    3
 8 [loop_back]#    2
 9 [loop_back]#    1
10 [loop_back]#    0
11 [~data]#    4
12 [~chains]#     work over. 
13 [~data]#    3
14 [~chains]#     work over. 
15 [~data]#    2
16 [~chains]#     work over. 
17 [~data]#    1
18 [~chains]#     work over. 
19 [~data]#    0
20 [~chains]#     work over.

 

 

四、参考资料:

 

  1、  数据结构、算法与应用(c++语言描述)edition 2  -- {作者:sartaj sahni;译者:王立柱,刘志宏; 出版社:机械工业出版社; 版次:2020.10,第1版第13次印刷 }

 

标签:data,链表,双向,cpp,链节,chains,loop,first
From: https://www.cnblogs.com/lnlidawei/p/18015045

相关文章

  • 力扣链表 哈希表 之 146. LRU 缓存
    请你设计并实现一个满足 LRU(最近最少使用)缓存约束的数据结构。实现LRUCache类:LRUCache(intcapacity)以正整数作为容量 capacity初始化LRU缓存intget(intkey)如果关键字key存在于缓存中,则返回关键字的值,否则返回-1。voidput(intkey,intvalue) ......
  • 【C++】两两交换链表中的节点
    #include<iostream>#include<stack>usingnamespacestd;structListNode{intval;ListNode*next;ListNode(intx):val(x),next(nullptr){}};ListNode*swapPairs1(ListNode*head){ListNode*dummyHead=newListNode(0);dummyHead......
  • 【C++】给定两个增序的链表,试将其合并成一个增序的链表。
    给定两个增序的链表,试将其合并成一个增序的链表。#include<iostream>#include<stack>usingnamespacestd;structListNode{intval;ListNode*next;ListNode(intx):val(x),next(nullptr){}};voidprintList(ListNode*head){while(head){std:......
  • 【C++】假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。
    题目:假设链表中每一个节点的值都在0-9之间,那么链表整体就可以代表一个整数。给定两个这种链表,请生成代表两个整数相加值的结果链表。数据范围:0≤n,m≤1000000,链表任意值0≤val≤9要求:空间复杂度O(n),时间复杂度O(n)例如:链表1为9->3->7,链表2为6->3,最后生成新的结果链表......
  • 力扣递归 两道简单题合成一道中等题之148. 排序链表
    递归归并排序,先找到终点,再合并两个链表 给你链表的头结点 head ,请将其按升序排列并返回排序后的链表。 示例1:输入:head=[4,2,1,3]输出:[1,2,3,4]示例2:输入:head=[-1,5,3,4,0]输出:[-1,0,3,4,5]示例3:输入:head=[]输出:[]/** *Definitionforsingl......
  • 力扣快慢双指针之876. 链表的中间结点
    给你单链表的头结点head,请你找出并返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。 示例1:输入:head=[1,2,3,4,5]输出:[3,4,5]解释:链表只有一个中间结点,值为3。示例2:输入:head=[1,2,3,4,5,6]输出:[4,5,6]解释:该链表有两个中间结点,值分别为3......
  • 力扣递归之21. 合并两个有序链表
    将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。  示例1:输入:l1=[1,2,4],l2=[1,3,4]输出:[1,1,2,3,4,4]示例2:输入:l1=[],l2=[]输出:[]示例3:输入:l1=[],l2=[0]输出:[0]classSolution{publicListN......
  • Gateway API 实践之(九)FSM Gateway 的双向 TLS
    FSMGateway流量管理策略系列:故障注入黑白名单访问控制限速重试会话保持健康检查负载均衡算法TLS上游双向TLS网关开启mTLS(双向TLS验证)的功能是一种高级安全措施,它不仅要求服务器向客户端证明其身份,同样要求客户端提供证书以证实其身份。这种双向验证极大地增强了通信的安全性......
  • 数据结构(一)单链表---以题为例
    实现一个单链表,链表初始为空,支持三种操作:向链表头插入一个数;删除第 k 个插入的数后面的数;在第 k 个插入的数后插入一个数。现在要对该链表进行 M 次操作,进行完所有操作后,从头到尾输出整个链表。注意:题目中第 k 个插入的数并不是指当前链表的第 k 个数。例如操作......
  • 一些cpp注意事项
    array拷贝至vectorintA[]={1,2,3,4};intAsize=sizeof(A)/sizeof(int);vector<int>V(A,A+Asize);sort()函数中的cmp()必须遵循严格弱序//升序boolcmp1(constint&a,constint&b){ returna<b;}//降序boolcmp2(constint&a,const......