带头节点带环双向链表的一些操作(2)

删除pos位置的元素

首先先要判断链表是否合法和链表是否为空链表。链表删除pos位置元素前后链表指向的变化主要是要删除的元素to_delete元素的下一个节点next和要删除的元素to_delete元素的上一个节点prev。在删除pos位置元素之前,链表指向为to_delete->next指向next,to_delete->prev指向prev,删除pos位置元素之后,prev->next指向next,next->prev指向prev,具体如图所示

157 //删除pos位置的元素
158 void DLinkListErase(DLinkNode* head,DLinkNode* to_delete)
159 {
160     if(head == NULL || to_delete == NULL)
161     {
162         //非法输入
163         return ;
164     }
165     if(head->next == NULL)
166     {
167         //空链表
168         return ;
169     }
170     DLinkNode* prev=to_delete->prev;
171     DLinkNode* next=to_delete->next;
172     prev->next=next;
173     next->prev=prev;                                                                                        
174     DestroyDLinkList(to_delete);
175     return ;
176 }

按值来删除元素

首先先要判断链表是否合法和链表是否为空链表。
然后要找到要删除值to_delete_value的位置,那这个问题就转化成了删除pos位置元素的问题,详细过程见上一题
177 //按值来删除元素
178 void DLinkListRemove(DLinkNode* head,DLinkType to_delete_value)
179 {
180     if(head == NULL)
181     {
182         //非法输入
183         return ;
184     }
185     DLinkNode* to_delete=DLinkListFind(head,to_delete_value);
186     if(to_delete == NULL)
187     {
188         //没找到
189         return ;
190     }
191     DLinkListErase(head,to_delete);
192     return ;                                                                                                
193 }

按值来删除所有元素

大致过程同按值来删除元素的问题相同,只不过需要套用一个循环,来将重复的元素删除,具体过程见程序及上一问题
194 //按值来删除所有元素
195 void DLinkListRemoveAll(DLinkNode* head,DLinkType to_delete_value)
196 {
197     if(head == NULL)
198     {
199         //非法输入
200         return ;
201     }
202     while(1)
203     {
204         DLinkNode* to_delete=DLinkListFind(head,to_delete_value);
205         if(to_delete == NULL)
206         {
207             //没找到
208             return ;
209         }
210         DLinkListErase(head,to_delete);
211     }   
212     return ;                                                                                                
213 }

销毁链表

由于销毁链表需要改变链表的头指针,所以引用的参数是DLinkNode** phead,将链表的头节点的下一个节点设为cur,再将cur的下一个节点设为next,然后再销毁cur节点,再如此循环,直到头节点指向空
214 //销毁链表
215 void DLinkListDestroy(DLinkNode** phead)
216 {
217     if(phead == NULL)
218     {
219         //非法输入
220         return ;
221     }
222     DLinkNode* cur=(*phead)->next;
223     while(cur!=*phead)
224     {
225         DLinkNode* next=cur->next;
226         DestroyDLinkList(cur);
227     }
228     DestroyDLinkList(*phead);
229     *phead == NULL;
230 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值