标兵结点(头结点)是在链表中的第一个结点,不存放数据,仅仅是个标记
利用标兵结点可以简化代码。下面实现双向链表中的按值删除元素的函数,分别实现
带标兵结点和不带标兵结点两版本,对比可见标兵结点的好处。
结点声明如下:
struct Node { int value; Node *prev; Node *next; }
int del_doublelist(Node*&h,int v)//不带标兵结点 { Node*p=h; while(p!=NULL&&p->value!=v) { p=p->next; } if(p==NULL)return 0;//空链表 if(p->value==v) { if(p->next==NULL&&p->prev==NULL)//只有一个结点 { h=NULL; free(p); } else if(p->next==NULL)//尾结点 { p->prev->next=NULL; free(p); } else if(p->prev==NULL)//头结点 { h=p->next; h->prev=NULL; free(p); } else//中间结点 { p->prev->next=p->next; p->next->prev=p->prev; free(p); } return 1; } }
int del_doublelist(Node*&h,int v)//带标兵结点 { Node*p=h->next; while(p!=NULL&&p->value!=v) { p=p->next; } if(p==NULL)return 0; if(p->value==v) { if(p->next==NULL)//尾结点 { p->next->prev=p->prev; free(p); } else//中间结点 { p->next->prev=p->prev; p->prev->next=p->next; free(p); } return 1; } }
时间: 2024-10-12 16:41:20