• 数据结构 顺序表 ——— 链表


    链表,重要的数据结构有三点优点

    1)插入删除速度快O(1)(前提是知道插入的位置的前一个节点)

    2)内存利用率高,不会浪费内存

    3)大小没有固定,拓展很灵活

    以单链表为例,实现一下单链表的增删改查

    首先,先实现节点的定义

    1. typedef struct List_Nodes
    2. {
    3. int data;
    4. List_Nodes *Next;
    5. List_Nodes(int x):data(x) , Next(nullptr) {} // 初始化
    6. }node;

     

    首先实现尾插法插入每一个节点

    1. bool _append(node *p)
    2. {
    3. if(!head) head = tail = p;
    4. else
    5. {
    6. tail -> Next = p;
    7. tail = tail -> Next;
    8. }
    9. }

    其次实现给定位置插入(这里的位置)

    1. bool _insert(node *p , int cnt) // 插入到第cnt位置后面
    2. {
    3. node *temp = getpos(cnt);
    4. p -> Next = temp -> Next;
    5. temp -> Next = p;
    6. return true;
    7. }

    1. bool _delete(int cnt)// 删除第cnt位置
    2. {
    3. node *temp = getpos(cnt);
    4. if(!temp) return false;
    5. if(temp != tail) temp -> Next = temp -> Next -> Next;
    6. else temp -> Next = nullptr;
    7. return true;
    8. }

    1. bool _find(int cnt)// 查第cnt位置
    2. {
    3. node *temp = getpos(cnt);
    4. if(!temp) return false;
    5. else
    6. {
    7. printf("data[%d] = %d\n",cnt , temp -> data);
    8. return true;
    9. }
    10. }

    改,可以通过insert和delete操作共同进行实现

    里面还有一个关键函数就是getpos函数,实现的结果就是得到给定位置的节点。

    1. node *getpos(int i)// 寻找第i个节点
    2. {
    3. if(i < 0) return head; // 小于0定位于head
    4. int cnt = 0;
    5. node *temp = head;
    6. while(temp && cnt < i)
    7. {
    8. temp = temp -> Next;
    9. cnt ++;
    10. }
    11. return temp;
    12. }

    完整代码:使用随机种子得到输入数据

    1. #include
    2. #include
    3. using namespace std;
    4. typedef struct List_Nodes
    5. {
    6. int data;
    7. List_Nodes *Next;
    8. List_Nodes(int x):data(x) , Next(nullptr) {} // 初始化
    9. }node;
    10. class Link_List
    11. {
    12. private:
    13. node *head , *tail;
    14. public:
    15. Link_List()
    16. {
    17. head = tail = nullptr;
    18. }
    19. bool _append(node *p)
    20. {
    21. if(!head) head = tail = p;
    22. else
    23. {
    24. tail -> Next = p;
    25. tail = tail -> Next;
    26. }
    27. }
    28. node *getpos(int i)// 寻找第i个节点
    29. {
    30. if(i < 0) return head; // 小于0定位于head
    31. int cnt = 0;
    32. node *temp = head;
    33. while(temp && cnt < i)
    34. {
    35. temp = temp -> Next;
    36. cnt ++;
    37. }
    38. return temp;
    39. }
    40. bool _insert(node *p , int cnt) // 插入到第cnt位置后面
    41. {
    42. node *temp = getpos(cnt);
    43. p -> Next = temp -> Next;
    44. temp -> Next = p;
    45. return true;
    46. }
    47. bool _delete(int cnt)// 删除第cnt位置
    48. {
    49. node *temp = getpos(cnt);
    50. if(!temp) return false;
    51. if(temp != tail) temp -> Next = temp -> Next -> Next;
    52. else temp -> Next = nullptr;
    53. return true;
    54. }
    55. bool _find(int cnt)// 查第cnt位置
    56. {
    57. node *temp = getpos(cnt);
    58. if(!temp) return false;
    59. else
    60. {
    61. printf("data[%d] = %d\n",cnt , temp -> data);
    62. return true;
    63. }
    64. }
    65. void print()
    66. {
    67. node *temp = head;
    68. cout << "list = [";
    69. while(temp)
    70. {
    71. cout << " " << temp -> data << " ";
    72. temp = temp -> Next;
    73. }
    74. cout << "]\n";
    75. }
    76. };
    77. int main()
    78. {
    79. srand(time(0));
    80. Link_List list;
    81. for(int i = 0;i < 10;i ++)
    82. {
    83. int data = rand() % 10;
    84. node *p = new List_Nodes(data);
    85. list._append(p);
    86. }
    87. cout << "init : ";
    88. list.print();
    89. for(int i = 0;i < 20;i ++)
    90. {
    91. int x = rand() % 3;
    92. int pos = rand() % 11 - 1;// 取值范围[-1 , 9]
    93. if(x == 0)
    94. {
    95. cout << "insert : ";
    96. int num = rand() % 10;
    97. node *temp = new List_Nodes(num);
    98. list._insert(temp , pos);
    99. }
    100. else if(x == 1)
    101. {
    102. cout << "delete : ";
    103. list._delete(pos);
    104. }
    105. else if(x == 2)
    106. {
    107. cout << "find : ";
    108. list._find(pos);
    109. }
    110. list.print();
    111. }
    112. return 0;
    113. }

    运行的结果大致就是这样:

    init : list = [ 2  0  3  3  1  0  7  5  0  5 ]
    insert : list = [ 2  0  5  3  3  1  0  7  5  0  5 ]
    insert : list = [ 2  0  5  0  3  3  1  0  7  5  0  5 ]
    find : data[2] = 5
    list = [ 2  0  5  0  3  3  1  0  7  5  0  5 ]
    delete : list = [ 2  0  5  3  3  1  0  7  5  0  5 ]
    delete : list = [ 2  0  5  3  3  0  7  5  0  5 ]
    find : data[9] = 5
    list = [ 2  0  5  3  3  0  7  5  0  5 ]
    find : data[4] = 3
    list = [ 2  0  5  3  3  0  7  5  0  5 ]
    insert : list = [ 2  2  0  5  3  3  0  7  5  0  5 ]
    delete : list = [ 2  2  0  3  3  0  7  5  0  5 ]
    delete : list = [ 2  2  3  3  0  7  5  0  5 ]
    delete : list = [ 2  2  3  3  0  7  0  5 ]
    find : data[0] = 2
    list = [ 2  2  3  3  0  7  0  5 ]
    delete : list = [ 2  2  3  0  7  0  5 ]
    find : data[2] = 3
    list = [ 2  2  3  0  7  0  5 ]
    insert : list = [ 2  2  3  0  7  0  2  5 ]
    insert : list = [ 2  6  2  3  0  7  0  2  5 ]
    delete : list = [ 2  6  2  3  7  0  2  5 ]
    find : data[7] = 5
    list = [ 2  6  2  3  7  0  2  5 ]
    insert : list = [ 2  6  2  1  3  7  0  2  5 ]
    insert : list = [ 2  4  6  2  1  3  7  0  2  5 ]
     

  • 相关阅读:
    【5GC】5G PDU会话以及会话类型
    【数智化人物展】同方有云联合创始人兼总经理江琦:云计算,引领数智化升级的动能...
    [极客大挑战 2019]BuyFlag 1(两种解法)
    LeetCode 面试题 08.06. 汉诺塔问题
    Spring Cloud Circuit Breaker 使用示例
    【论文写作】符号:矩阵、向量的乘法、内积、点积等
    51单片机的hello world之点灯
    Android Framework 裁剪
    List集合实现分页
    成绩定级脚本(Python)
  • 原文地址:https://blog.csdn.net/xp_xht123/article/details/126804744