这种基础例程,如之前所提,会有一个实现和一个简单的测试代码。
链表其实没什么可说的,其实包括后面的栈和队列也没什么可说的,直接放代码吧。
下面这个是测试代码
1 #include <iostream> 2 #include "linklist.h" 3 using namespace std; 4 using namespace linklist; 5 template class List<int>; 6 int main(void) 7 { 8 List<int> number; 9 10 //测试插入 11 cout << "/*additem()*/" << endl; 12 number.additem(2); 13 number.additem(3); 14 number.additem(5); 15 number.additem(7); 16 number.additem(11); 17 number.traverse(); 18 cout << " /*end*/ "<< flush; 19 20 //测试获取长度 21 cout << "/*length()*/" << endl; 22 cout << number.size() << endl; 23 cout << "/*end*/ " << flush; 24 25 //测试获得头元素 26 cout << "/*getfirst()*/" << endl; 27 cout << number.getfirst() << endl; 28 cout << "/*end*/ " << flush; 29 30 //测试删除存在的元素 31 cout << "/*remove()*/" << endl; 32 number.remove(5); 33 number.traverse(); 34 cout << " /*end*/ " << flush; 35 36 //测试删除不存在的元素 37 cout << "/*remove()*/" << endl; 38 number.remove(13); 39 cout << "/*end*/ " << flush; 40 41 //测试清空,并测试从空表中删除元素 42 cout << "/*clear(),remove()*/" << endl; 43 number.clear(); 44 number.remove(2); 45 cout << "/*end*/ " << flush; 46 47 system("pause"); 48 }
主体
1 #ifndef LINKLIST 2 #define LINKLIST 3 #include <iostream> 4 using namespace std; 5 6 namespace linklist 7 { 8 9 //链表节点模板 10 template <typename T> struct Node 11 { 12 Node<T>() : next(nullptr){} 13 Node<T>(const T &item, Node<T>* ptr = nullptr) : data(item), next(ptr){} 14 T data; 15 Node<T>* next; 16 }; 17 //头节点及链表主体操作 18 template <typename T> class List 19 { 20 //构造函数 21 public: 22 List<T>() : length(0), front(nullptr){} 23 //接口 24 public: 25 //返回长度 26 unsigned int size()const{ return length; } 27 //返回头指针 28 Node<T>* begin()const{ return front; } 29 //判断是否为空 30 bool empty()const{ return length == 0; } 31 //获得头元素 32 T getfirst()const{ return front->data; } 33 //#查找元素所在地址 34 Node<T>* find(const T &item)const; 35 //#尾部加入新元素 36 bool additem(const T &item); 37 //#删除指定元素 38 bool remove(const T &item); 39 //#遍历并输出链表元素 40 void traverse()const; 41 //清空链表 42 void clear(); 43 44 //辅助函数 45 private: 46 //#查找元素前驱 47 Node<T>* find_prev(const T& item)const; 48 //数据 49 private: 50 unsigned int length; 51 Node<T>* front; 52 }; 53 54 //如果元素为头元素或元素不存在则返回nullptr,否则返回前驱 55 template <typename T> Node<T>* List<T>::find_prev(const T& item)const 56 { 57 if (length == 0) 58 return nullptr; 59 if (front->data == item) 60 return nullptr; 61 for (Node<T>* iter = front; iter->next != nullptr; iter = iter->next) 62 { 63 if (iter->next->data == item) 64 return iter; 65 } 66 return nullptr; 67 } 68 //调用find_prev,如果元素存在则返回地址,不存在则返回nullptr 69 template <typename T> Node<T>* List<T>::find(const T &item)const 70 { 71 Node<T>* iter = find_prev(item); 72 if (length == 0) 73 return nullptr; 74 if (front->data == item) 75 return front; 76 return iter->next; 77 } 78 template <typename T> bool List<T>::additem(const T &item) 79 { 80 Node<T>* pnew = new Node<T>(item); 81 if (length == 0) 82 front = pnew; 83 else 84 { 85 Node<T>* iter = front; 86 while (iter->next != nullptr) 87 iter = iter->next; 88 iter->next = pnew; 89 } 90 ++length; 91 return true; 92 } 93 template <typename T> bool List<T>::remove(const T &item) 94 { 95 if (length == 0) //先判断链表是否空避免front->data未定义 96 { 97 cout << "No data!" << endl; 98 return false; 99 } 100 Node<T>* iter = find_prev(item); 101 if (iter == nullptr && front->data != item) 102 { 103 cout << "Can not find!" << endl; 104 return false; 105 } 106 Node<T>* save; 107 if (front->data == item) 108 { 109 save = front; 110 front = front->next; 111 free(save); 112 } 113 else 114 { 115 save = iter->next; 116 iter->next = iter->next->next; 117 free(save); 118 } 119 --length; 120 return true; 121 } 122 template <typename T> void List<T>::traverse()const 123 { 124 if (length != 0) 125 { 126 for (Node<T>* iter = front; iter != nullptr; iter = iter->next) 127 cout << iter->data << ends; 128 } 129 } 130 template <typename T> void List<T>::clear() 131 { 132 Node<T>* iter; 133 while (front != nullptr) 134 { 135 iter = front; 136 front = front->next; 137 delete iter; 138 } 139 front = nullptr; 140 length = 0; 141 } 142 } 143 #endif