• 链表:C++实现


    引言:

            链表是一种常见的数据结构,它由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。相比于数组,链表具有动态性和灵活性,可以高效地进行插入和删除操作,但是查找操作的时间复杂度较高。在C++中,我们可以通过定义一个节点结构体和一个链表类来实现链表。

    技术实现:

            首先,我们定义一个节点结构体Node,包含一个数据元素data和一个指向下一个节点的指针next。这里使用了模板typename Element,表示可以存储任意类型的数据元素。

    1. template<typename Element>
    2. struct Node
    3. {
    4. Element data;
    5. Node* next;
    6. };

            接下来,我们定义一个链表类LinkList,包含一些常用的操作函数。构造函数LinkList()用于创建一个空链表,构造函数LinkList(Element a[], int n)用于创建一个包含n个元素的链表,析构函数~LinkList()用于释放链表的内存空间。getlenth()函数用于获取链表的长度,getItem(int i)函数用于获取链表中第i个元素,locate(Element x)函数用于查找元素x在链表中的位置,insert(int i, Element x)函数用于在链表中第i个位置插入元素x,remove(int i)函数用于删除链表中第i个元素,empty()函数用于判断链表是否为空,printList()函数用于打印链表中所有元素。

    1. template<typename Element>
    2. class LinkList
    3. {
    4. public:
    5. LinkList();
    6. LinkList(Element a[], int n);
    7. ~LinkList();
    8. int getlenth();
    9. Element getItem(int i);
    10. int locate(Element x);
    11. void insert(int i, Element x);
    12. Element remove(int i);
    13. bool empty();
    14. void printList();
    15. private:
    16. Node* head;
    17. };

            在LinkList类的实现中,我们需要注意一些细节。首先,在构造函数LinkList()中,我们需要将头指针head初始化为空指针。在构造函数LinkList(Element a[], int n)中,我们需要依次创建n个节点,并将它们连接起来。在析构函数~LinkList()中,我们需要依次删除所有节点,并释放它们的内存空间。在insert(int i, Element x)函数中,我们需要先找到第i-1个节点,然后插入新节点,并将它的next指针指向第i个节点。在remove(int i)函数中,我们需要先找到第i-1个节点,然后将它的next指针指向第i+1个节点,并删除第i个节点。 

    1. template<typename Element>
    2. LinkList::LinkList() {
    3. head = new Node;
    4. head->next = nullptr;
    5. }
    6. //头插法初始化
    7. template<typename Element>
    8. LinkList::LinkList(Element a[], int n) {
    9. head->next = nullptr;
    10. for (int i = 0; i < n; i++) {
    11. LinkList s;
    12. s->data = a[i];
    13. s->next = head->next;
    14. head->next = s;
    15. }
    16. }
    17. template<typename Element>
    18. LinkList::~LinkList() {
    19. while (head->next != nullptr) {
    20. Element* p = head->next;
    21. head->next = p->next;
    22. delete p;
    23. }
    24. }
    25. template<typename Element>
    26. int LinkList::getlenth() {
    27. int count = 0;
    28. LinkList* p = head->next;
    29. while (p != nullptr) {
    30. count++;
    31. p = p->next;
    32. }
    33. return count;
    34. }
    35. template<typename Element>
    36. Element LinkList::getItem(int i) {
    37. int j = 0;
    38. LinkList* p = head->next;
    39. while (j < i) {
    40. j++;
    41. p = p->next;
    42. if (p == nullptr) {
    43. printf( "不存在\n");
    44. break;
    45. }
    46. }
    47. return p->data;
    48. }
    49. template<typename Element>
    50. int LinkList::locate(Element x) {
    51. LinkList* p = head->next;
    52. int j = 0;
    53. while (p != nullptr) {
    54. j++;
    55. p = p->next;
    56. if (p ->data== x) {
    57. return j;
    58. }
    59. }
    60. }
    61. template<typename Element>
    62. void LinkList::insert(int i, Element x) {
    63. LinkList* p = head;
    64. int j = 0;
    65. while (p != nullptr && j < i - 1) {
    66. p = p->next;
    67. j++;
    68. }
    69. if (p == nullptr) printf("插入位置异常\n");
    70. else {
    71. LinkList s;
    72. s->data = x;
    73. s->next = p->next;
    74. p->next = s;
    75. }
    76. }
    77. template<typename Element>
    78. Element LinkList::remove(int i) {
    79. LinkList p = head;
    80. int j = 0;
    81. while (p != nullptr && j < i - 1) {
    82. p = p->next;
    83. j++;
    84. }
    85. if (p == nullptr || p->next == nullptr) {
    86. printf( "删除位置异常\n");
    87. }
    88. else {
    89. LinkList q = p->next;
    90. int x = q->data;
    91. p->next = q->next;
    92. delete q;
    93. return x;
    94. }
    95. }
    96. template<typename Element>
    97. bool LinkList::empty() {
    98. return head->next == nullptr;
    99. }
    100. template<typename Element>
    101. void LinkList::printList() {
    102. LinkList p = head->next;
    103. while (p != nullptr ) {
    104. printf("%d ", p->data);
    105. p = p->next;
    106. }
    107. printf( "\n");
    108. }

    最后,我们可以在主函数中进行链表的测试。例如,创建一个包含5个元素的链表,插入一个元素,删除一个元素,并打印链表中所有元素。

    1. int main()
    2. {
    3. int a[] = { 1, 2, 3, 4, 5 };
    4. LinkList<int> list(a, 5);
    5. list.printList(); // 1 2 3 4 5
    6. list.insert(3, 6);
    7. list.printList(); // 1 2 6 3 4 5
    8. list.remove(4);
    9. list.printList(); // 1 2 6 4 5
    10. return 0;
    11. }

    结尾: 

            以上就是C++实现链表的全部内容。链表是一种基础的数据结构,掌握它的实现方法对于编写高效的算法和程序非常重要。 

     

     

     

  • 相关阅读:
    unity 性能优化指标
    哪个运动耳机比较好用、运动耳机推荐性价比
    使用Python调用Linux下的动态链接库
    异构数据源同步之数据同步 → DataX 使用细节
    antv-G6知识图谱安装--使用(实例)--连接线修改成动态,并添加跟随线移动的光圈,设置分支跟踪定位功能
    广读论文核心思路汇总笔记 (一些有意思的论文and论文在研究的一些有意思的问题or场景应用)
    初步使用openEuler华为欧拉Linux系统
    Kubernetes调度器:资源分配与优化之道
    SpringBoot多环境开发分组管理group
    前端开发常用哪些工具软件?
  • 原文地址:https://blog.csdn.net/Hamdh/article/details/134520582