删除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 }