C++实现单链表常用功能(不带头结点)

自己用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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值