①按位序删除(带头结点)
//按位序删除(带头结点)
bool ListDelete(LinkList &L,int i,ElemType &e)
{
if(i<1)
return false;
LNode *p; //指针p指向当前扫描到的结点
int j=0; //当前p指向的第几个结点
p=L; //L指向头节点,头结点是第0个结点(不存数据)
while(p!=NULL && j<i-1) //循环找到第i-1个结点
{
p=p->next;
j++;
}
if(p==NULL) //i值不合法
return false;
if(p->next==NULL) //第i-1结点之后已无其他结点
return false;
LNode *q=p->next; //令q指向被删除的结点
e=q->data; //用e返回元素值
p->next = q->next; //将*q结点从链中“断开”
free(q); //释放结点的存储空间
return true; 删除成功
}
②删除指定结点P
//删除指定结点P
bool DeleteNode(LNode *p)
{
if(p==NULL)
return false;
LNode *q=p->next; //令q指向*p的后继结点
p->data=p->next->data; //和后继结点交换数据域
p->next=q->next; //将*q结点从链中“断开”
free(q); //释放后继结点的存储空间
return true;
}
如果P是最后一个结点则上述代码行不通,只能从开始依次寻找P的前驱结点。