当前位置:   article > 正文

c++模板类实现线性表链式存储_用类实现线性表

用类实现线性表

对比c语言实现线性表的链式存储,分析不同之处!

LinkList.h

  1. #pragma once
  2. //在插入元素时,模板类中应该把每个T保存下来
  3. //模板类中应该能后 分配节点 缓存节点
  4. //怎么样缓存===> 做链表
  5. template<typename T>
  6. struct Node
  7. {
  8. T t;
  9. Node<T> *next;
  10. };
  11. template <typename T>
  12. class LinkList
  13. {
  14. public:
  15. LinkList(void);
  16. ~LinkList(void);
  17. void clear();
  18. int getLength();
  19. int insert(T &t,int pos);
  20. int get(int pos,T &t);
  21. int del(int pos,T &t);
  22. private:
  23. Node<T>*head;//相当于c语言中的链表的头结点
  24. int length;
  25. };

LinkList.cpp

  1. #include "LinkList.h"
  2. template <typename T>
  3. LinkList<T>::LinkList()
  4. {
  5. this->head = new Node<T>;
  6. head->next = NULL;
  7. this->length = 0;
  8. }
  9. template <typename T>
  10. LinkList<T>::~LinkList()
  11. {
  12. //删除内部创建的节点
  13. Node<T> *tmp = NULL;
  14. while (head!=NULL)
  15. {
  16. tmp = head->next;
  17. delete head;
  18. head = tmp;
  19. }
  20. this->length = 0;
  21. head = NULL;
  22. }
  23. template <typename T>
  24. void LinkList<T>::clear()
  25. {
  26. //删除内部创建的节点
  27. Node<T> *tmp = NULL;
  28. while (this->head!=NULL)
  29. {
  30. tmp = head->next;
  31. delete head;
  32. head = tmp;
  33. }
  34. this->head = NULL;
  35. //创建头结点
  36. this->head = new Node<T>;
  37. head->next = NULL;
  38. this->length = 0;
  39. return ;
  40. }
  41. template <typename T>
  42. int LinkList<T>::getLength()
  43. {
  44. return this->length;
  45. }
  46. template <typename T>
  47. int LinkList<T>::insert(T &t,int pos)
  48. {
  49. Node<T> *current = this->head;
  50. //移动辅助指针变量current指向2号位置
  51. for (int i=0;i<pos&&(current->next!=NULL);i++)
  52. {
  53. current = current->next;
  54. }
  55. //思考一个问题? 新节点(要插入的节点)存在吗
  56. Node<T> *node = new Node<T>;
  57. if (node==NULL)
  58. {
  59. cout<<"func insert() err"<<endl;
  60. return -1;
  61. }
  62. node->t = t;//缓存外部数据
  63. node->next = NULL;
  64. //让新节点node指向后续节点
  65. node->next = current->next;
  66. //当前位置2号 的next域赋值为node
  67. current->next = node;
  68. this->length++;
  69. return 0;
  70. }
  71. template <typename T>
  72. int LinkList<T>::get(int pos,T &t)
  73. {
  74. Node<T> *current = this->head;
  75. //移动辅助指针变量current指向2号位置
  76. for (int i=0;i<pos&&(current->next!=NULL);i++)
  77. {
  78. current = current->next;
  79. }
  80. //思考一个问题? 新节点(要插入的节点)存在吗
  81. t = current->next->t;//把缓存的数据t 传递给调用者
  82. return 0;
  83. }
  84. template <typename T>
  85. int LinkList<T>::del(int pos,T &t)
  86. {
  87. Node<T> *current = this->head;
  88. Node<T> *ret = NULL;
  89. //移动辅助指针变量current指向2号位置
  90. for (int i=0;i<pos&&(current->next!=NULL);i++)
  91. {
  92. current = current->next;
  93. }
  94. ret = current->next;//被删除的元素节点
  95. t = ret->t;//把缓存的t拷贝
  96. current->next = ret->next;
  97. this->length--;
  98. delete ret;//释放
  99. return 0;
  100. }

test.cpp

  1. #include <iostream>
  2. #include "LinkList.cpp"
  3. using namespace std;
  4. struct Teacher
  5. {
  6. char name[20];
  7. int age;
  8. };
  9. void display_linklist()
  10. {
  11. Teacher t1,t2,t3;
  12. Teacher tmp;
  13. LinkList<Teacher> list;
  14. t1.age = 10;
  15. t2.age = 20;
  16. t3.age = 30;
  17. list.insert(t1,0);
  18. list.insert(t2,0);
  19. list.insert(t3,0);
  20. for (int i =0;i<list.getLength();i++)
  21. {
  22. list.get(i,tmp);
  23. cout<<tmp.age<<endl;
  24. }
  25. //链表清空
  26. list.clear();
  27. list.insert(t1,0);
  28. list.insert(t2,0);
  29. list.insert(t3,0);
  30. for (int i =0;i<list.getLength();i++)
  31. {
  32. list.get(i,tmp);
  33. cout<<tmp.age<<endl;
  34. }
  35. //链表的删除
  36. while(list.getLength()>0)
  37. {
  38. list.del(0,tmp);
  39. cout<<tmp.age<<endl;
  40. }
  41. }
  42. int main()
  43. {
  44. display_linklist();
  45. system("pause");
  46. return 0;
  47. }


声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号