自己用C++实现最基本的数据结构之一单链表,常用功能都有了,可以很方便的进行栈和队列功能的扩展。另外,感谢老婆花了一个晚上帮忙测试,能够想到的场景都经过单元测试。下面是代码。
singlelist.h:链表结点数据元素类型ELEMTYPE,重载了运算符==,=,<,>,方便运算。
1 #ifndef SINGLE_LIST_H 2 #define SINGLE_LIST_H 3 #include <stdlib.h> 4 #include <stdio.h> 5 6 enum 7 { 8 RET_SUCCESS = 0, 9 RET_FAILURE = -1 10 }; 11 12 enum 13 { 14 TRUE = 1, 15 FALSE = 0 16 }; 17 18 typedef struct sElemType 19 { 20 int m_iData; 21 sElemType& operator= (const sElemType& elem) 22 { 23 if(this == &elem) 24 { 25 return *this; 26 } 27 this->m_iData = elem.m_iData; 28 return *this; 29 } 30 31 int operator> (const sElemType& elem) 32 { 33 if(this->m_iData > elem.m_iData) 34 { 35 return TRUE; 36 } 37 return FALSE; 38 } 39 40 int operator< (const sElemType& elem) 41 { 42 if(this->m_iData < elem.m_iData) 43 { 44 return TRUE; 45 } 46 return FALSE; 47 } 48 49 int operator== (const sElemType& elem) 50 { 51 if(this->m_iData == elem.m_iData) 52 { 53 return TRUE; 54 } 55 return FALSE; 56 } 57 58 void print() 59 { 60 printf("%d",m_iData); 61 } 62 } ELEMTYPE; 63 64 typedef struct ListNode 65 { 66 ELEMTYPE data; 67 ListNode* next; 68 } ListNode; 69 70 //头部插入 71 int insertAtHead(ListNode* &head,ELEMTYPE& elem); 72 73 //尾部插入 74 int insertAtTail(ListNode* &head,ELEMTYPE& elem); 75 76 //头部删除 77 int deleteHead(ListNode* &head,ELEMTYPE& elem); 78 79 //尾部删除 80 int deleteTail(ListNode* &head,ELEMTYPE& elem); 81 82 //获取头结点元素 83 int getHead(ListNode* &head,ELEMTYPE& elem); 84 85 //获取尾结点元素 86 int getTail(ListNode* &head,ELEMTYPE& elem); 87 88 //在相等元素后插入 89 int insertNode(ListNode* &head,ELEMTYPE& elem); 90 91 //删除相应元素 92 int deleteNode(ListNode* &head,ELEMTYPE& elem); 93 94 //在相应位置插入 95 int insertLocation(ListNode* &head,int iLocation,ELEMTYPE& elem); 96 97 //删除相应位置元素 98 int deleteLocation(ListNode* &head,int iLocation,ELEMTYPE& elem); 99 100 //链表长度 101 int getListLength(ListNode* &head); 102 103 //查找元素在链表中位置 104 int search(ListNode* &head,ELEMTYPE& elem,int &iLocation); 105 106 //逆序 107 int reverse(ListNode* &head); 108 109 //排序 110 void sort(ListNode* &head); 111 112 //是否空 113 int isEmpty(ListNode* &head); 114 115 //清除所有结点 116 int clearAll(ListNode* &head); 117 118 //打印结点信息 119 int DisplayList(ListNode* &head); 120 #endif
singlelist.cpp:
1 #include "singlelist.h" 2 3 int insertAtHead(ListNode* &head,ELEMTYPE& elem) 4 { 5 ListNode* pNode = (ListNode*)malloc(sizeof(ListNode)); 6 pNode->data = elem; 7 if(head == NULL) 8 { 9 head = pNode; 10 pNode->next = NULL; 11 return RET_SUCCESS; 12 } 13 pNode->next = head; 14 head = pNode; 15 return RET_SUCCESS; 16 } 17 18 int insertAtTail(ListNode* &head,ELEMTYPE& elem) 19 { 20 ListNode* pNode = (ListNode*)malloc(sizeof(ListNode)); 21 pNode->data = elem; 22 if(head == NULL) 23 { 24 head = pNode; 25 pNode->next = NULL; 26 return RET_SUCCESS; 27 } 28 ListNode* p = head; 29 while(NULL != p->next) 30 { 31 p = p->next; 32 } 33 p->next = pNode; 34 pNode->next = NULL; 35 return RET_SUCCESS; 36 } 37 38 int deleteHead(ListNode* &head,ELEMTYPE& elem) 39 { 40 if(NULL == head) 41 { 42 return RET_FAILURE; 43 } 44 ListNode* pNode = head; 45 head = head->next; 46 elem = pNode->data; 47 free(pNode); 48 return RET_SUCCESS; 49 } 50 51 int deleteTail(ListNode* &head,ELEMTYPE& elem) 52 { 53 if(NULL == head) 54 { 55 return RET_FAILURE; 56 } 57 if(NULL == head->next) 58 { 59 elem = head->data; 60 free(head); 61 head = NULL; 62 return RET_SUCCESS; 63 } 64 ListNode* p = head; 65 ListNode* q = p; 66 while(NULL != p->next) 67 { 68 q = p; 69 p = p->next; 70 } 71 elem = p->data; 72 q->next = NULL; 73 free(p); 74 return RET_SUCCESS; 75 } 76 77 int DisplayList(ListNode* &head) 78 { 79 if(NULL == head) 80 { 81 return RET_FAILURE; 82 } 83 ListNode* p = head; 84 while(NULL != p) 85 { 86 (p->data).print(); 87 printf("-->"); 88 p = p->next; 89 } 90 printf("NULL"); 91 return RET_SUCCESS; 92 } 93 94 //获取头结点元素 95 int getHead(ListNode* &head,ELEMTYPE& elem) 96 { 97 if(NULL == head) 98 { 99 return RET_FAILURE; 100 } 101 elem = head->data; 102 return RET_SUCCESS; 103 } 104 105 //获取尾结点元素 106 int getTail(ListNode* &head,ELEMTYPE& elem) 107 { 108 if(NULL == head) 109 { 110 return RET_FAILURE; 111 } 112 ListNode* p = head; 113 while(NULL != p->next) 114 { 115 p = p->next; 116 } 117 elem = p->data; 118 return RET_SUCCESS; 119 } 120 121 //在相等元素后插入 122 int insertNode(ListNode* &head,ELEMTYPE& elem) 123 { 124 if(NULL == head) 125 { 126 return RET_FAILURE; 127 } 128 ListNode* p = head; 129 while(NULL != p) 130 { 131 if(p->data == elem) 132 { 133 ListNode* pNode = (ListNode*)malloc(sizeof(ListNode)); 134 pNode->data = elem; 135 pNode->next = p->next; 136 p->next = pNode; 137 return RET_SUCCESS; 138 } 139 p = p->next; 140 } 141 return RET_FAILURE; 142 } 143 144 //删除相应元素 145 int deleteNode(ListNode* &head,ELEMTYPE& elem) 146 { 147 if(NULL == head) 148 { 149 return RET_FAILURE; 150 } 151 if(elem == head->data) 152 { 153 return deleteHead(head,elem); 154 } 155 ListNode* p = head; 156 ListNode* q = p; 157 while(NULL != p) 158 { 159 if(p->data == elem) 160 { 161 q->next = p->next; 162 free(p); 163 return RET_SUCCESS; 164 } 165 q = p; 166 p = p->next; 167 } 168 return RET_FAILURE; 169 } 170 171 //在相应位置插入 172 int insertLocation(ListNode* &head,int iLocation,ELEMTYPE& elem) 173 { 174 if(NULL == head) 175 { 176 if(iLocation != 0) 177 { 178 return RET_FAILURE; 179 } 180 else 181 { 182 return insertAtHead(head,elem); 183 } 184 } 185 if(0 == iLocation) 186 { 187 return insertAtHead(head,elem); 188 } 189 int i = 0; 190 ListNode* p = head; 191 while(NULL != p) 192 { 193 if( i == iLocation - 1) 194 { 195 ListNode* pNode = (ListNode*)malloc(sizeof(ListNode)); 196 pNode->data = elem; 197 pNode->next = p->next; 198 p->next = pNode; 199 return RET_SUCCESS; 200 } 201 p = p->next; 202 i++; 203 } 204 return RET_FAILURE; 205 } 206 207 //删除相应位置元素 208 int deleteLocation(ListNode* &head,int iLocation,ELEMTYPE& elem) 209 { 210 if(NULL == head) 211 { 212 return RET_FAILURE; 213 } 214 if(0 == iLocation) 215 { 216 return deleteHead(head,elem); 217 } 218 int i = 0; 219 ListNode* p = head; 220 ListNode* q = p; 221 while(NULL != p) 222 { 223 if(i == iLocation) 224 { 225 elem = p->data; 226 q->next = p->next; 227 free(p); 228 return RET_SUCCESS; 229 } 230 i++; 231 q = p; 232 p = p->next; 233 } 234 return RET_FAILURE; 235 } 236 237 //链表长度 238 int getListLength(ListNode* &head) 239 { 240 if(NULL == head) 241 { 242 return 0; 243 } 244 int i = 0; 245 ListNode* p = head; 246 while(NULL != p) 247 { 248 p= p->next; 249 i++; 250 } 251 return i; 252 } 253 254 //查找元素在链表中位置 255 int search(ListNode* &head,ELEMTYPE& elem,int &iLocation) 256 { 257 if(NULL == head) 258 { 259 return RET_FAILURE; 260 } 261 ListNode* p = head; 262 int i = 0; 263 while(NULL != p) 264 { 265 if(p->data == elem) 266 { 267 iLocation = i; 268 return RET_SUCCESS; 269 } 270 i++; 271 p = p->next; 272 } 273 return RET_FAILURE; 274 } 275 276 //是否空 277 int isEmpty(ListNode* &head) 278 { 279 if(NULL == head) 280 { 281 return TRUE; 282 } 283 return FALSE; 284 } 285 286 //清除所有结点 287 int clearAll(ListNode* &head) 288 { 289 ELEMTYPE elem; 290 while(head != NULL) 291 { 292 deleteHead(head,elem); 293 } 294 return RET_SUCCESS; 295 } 296 297 //逆序 298 int reverse(ListNode* &head) 299 { 300 if(NULL == head) 301 { 302 return RET_FAILURE; 303 } 304 if(NULL == head->next) 305 { 306 return RET_SUCCESS; 307 } 308 ListNode* p = head; 309 ListNode* q = head->next; 310 ListNode* pTemp; 311 while(q != NULL) 312 { 313 pTemp = q->next; 314 q->next = p; 315 p = q; 316 q = pTemp; 317 } 318 head->next = NULL; 319 head = p; 320 return RET_SUCCESS; 321 } 322 323 //排序 324 void sort(ListNode* &head) 325 { 326 if(NULL == head) 327 { 328 return; 329 } 330 331 ListNode* p = head; 332 while(NULL != p) 333 { 334 ListNode* q = head; 335 while(NULL != q->next) 336 { 337 if(q->data > q->next->data) 338 { 339 ELEMTYPE tempElem = q->data; 340 q->data = q->next->data; 341 q->next->data = tempElem; 342 } 343 q = q->next; 344 } 345 p = p->next; 346 } 347 }
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>