参考博客:数组、单链表和双链表介绍 以及 双向链表的C/C++/Java实现
一、单链表
单链表结构如下图:
本文中,head节点也是包含数据的,并且最后一个节点指向的指针为NULL。
下图为单链表的删除操作:
下图为单链表的插入操作:
单链表的实现代码如下:
1 #ifndef SINGLE_LINK_H 2 #define SINGLE_LINK_H 3 4 #include <iostream> 5 using namespace std; 6 7 template<class T> 8 struct SNode 9 { 10 public: 11 T data; 12 SNode *next; 13 SNode(){} 14 SNode(T data, SNode *next) 15 { 16 this->data = data; 17 this->next = next; 18 } 19 }; 20 21 template<class T> 22 class SingleLink 23 { 24 public: 25 SingleLink(); 26 ~SingleLink(); 27 28 SNode<T> *getHeadNode(); 29 void setHeadNode(SNode<T> *head); 30 int getSize(); 31 bool isEmpty(); 32 T get(int index); 33 T getFirst(); 34 T getLast(); 35 void insert(int index, T t); 36 void insertFirst(T t); 37 void appendLast(T t); 38 void del(int index); 39 void deleteFirst(); 40 void deleteLast(); 41 42 private: 43 int count; 44 SNode<T> *pHead; 45 SNode<T> *getNode(int index); 46 }; 47 48 template<class T> 49 SingleLink<T>::SingleLink() : count(0) 50 { 51 pHead = new SNode<T>(); 52 pHead->next = NULL; 53 } 54 55 template<class T> 56 SingleLink<T>::~SingleLink() 57 { 58 SNode<T> *ptmp; 59 while(pHead->next != NULL) 60 { 61 ptmp = pHead; 62 pHead = pHead->next; 63 delete ptmp; 64 } 65 66 delete pHead; 67 pHead = NULL; 68 } 69 70 template<class T> 71 int SingleLink<T>::getSize() 72 { 73 return count; 74 } 75 76 template<class T> 77 bool SingleLink<T>::isEmpty() 78 { 79 return count == 0; 80 } 81 82 template<class T> 83 SNode<T> *SingleLink<T>::getNode(int index) 84 { 85 if(index < 0 || index >= count) 86 { 87 cout << "Get node failed! The index in out of bound!" << endl; 88 return NULL; 89 } 90 91 SNode<T> *pindex = pHead; 92 int i = 0; 93 while(i++ < index) 94 { 95 pindex = pindex->next; 96 } 97 98 return pindex; 99 } 100 101 template<class T> 102 SNode<T> *SingleLink<T>::getHeadNode() 103 { 104 return getNode(0); 105 } 106 107 template<class T> 108 void SingleLink<T>::setHeadNode(SNode<T> *head) 109 { 110 this->pHead = head; 111 } 112 113 template<class T> 114 T SingleLink<T>::get(int index) 115 { 116 return getNode(index)->data; 117 } 118 119 template<class T> 120 T SingleLink<T>::getFirst() 121 { 122 return getNode(0)->data; 123 } 124 125 template<class T> 126 T SingleLink<T>::getLast() 127 { 128 return getNode(count - 1)->data; 129 } 130 131 template<class T> 132 void SingleLink<T>::insert(int index, T t) 133 { 134 SNode<T> *pnode; 135 136 if(index == 0) 137 { 138 insertFirst(t); 139 } 140 else if(index == count) 141 { 142 appendLast(t); 143 } 144 else 145 { 146 SNode<T> *pindex = getNode(index - 1); 147 pnode = new SNode<T>(t, pindex->next); 148 pnode->data = t; 149 pindex->next = pnode; 150 count++; 151 } 152 } 153 154 template<class T> 155 void SingleLink<T>::insertFirst(T t) 156 { 157 if(count == 0) 158 { 159 pHead->data = t; 160 } 161 else 162 { 163 SNode<T> *pnode = new SNode<T>(t, pHead); 164 pHead = pnode; 165 } 166 count++; 167 } 168 169 template<class T> 170 void SingleLink<T>::appendLast(T t) 171 { 172 SNode<T> *pindex = getNode(count - 1); 173 SNode<T> *pnode = new SNode<T>(); 174 pindex->next = pnode; 175 pnode->data = t; 176 pnode->next = NULL; 177 count++; 178 } 179 180 template<class T> 181 void SingleLink<T>::del(int index) 182 { 183 if(index >= count) 184 { 185 cout << "The index in out of bound!" << endl; 186 } 187 else 188 { 189 SNode<T> *pindex = getNode(index - 1); 190 SNode<T> *ptmp = pindex->next; 191 pindex->next = pindex->next->next; 192 delete ptmp; 193 ptmp = NULL; 194 count--; 195 } 196 } 197 198 template<class T> 199 void SingleLink<T>::deleteFirst() 200 { 201 if(count == 0) 202 { 203 cout << "This single link is null!"; 204 return; 205 } 206 SNode<T> *ptmp = pHead; 207 pHead = pHead->next; 208 delete ptmp; 209 ptmp = NULL; 210 count--; 211 } 212 213 template<class T> 214 void SingleLink<T>::deleteLast() 215 { 216 del(count - 1); 217 } 218 219 #endif