一、 按值删除元素
//删除
void DeleteElem(LinkList &L, ElemType e)
{
LinkList p = L;//p指向头结点
LinkList q = NULL;
while(p->next != NULL)
{
if(p->next->date == e) //从首元结点开始比对
{
q = p->next;//临时保存被删结点的地址以备释放
p->next = p->next->next;//改变删除结点前驱结点的指针域
break;
}
p = p->next;//p指向下一结点
}
if(q != NULL)
{
delete q;//释放删除结点的空间
}
}
二、删除第i个元素 (按序号删除元素)
//删除第i个元素
void DeleteIndex(LinkList &L, int i)
{
LinkList p = L;
LinkList q = NULL;
int num = 0;
while(p->next != NULL)
{
num++;
if( num == i)
{
q = p->next;
p->next = p->next->next;
break;
}
p = p->next;
}
if(q != NULL)
{
delete q;
}
}
三、删除第i个元素 (按序号删除元素)
算法步骤:
(1)查找结点a(i-1)并由指针p指向该结点。
(2)临时保存待删除结点a(i)的地址在q中,以备释放。
(3)将结点*p的指针域指向a(i)的直接后继结点。
(4)释放结点a(i)的空间。
void ListDelete(LinkList &L,int i)
{
//在带头结点的单链表L中,删除第i个元素
LinkList p = L;//p指向头结点
LinkList q = NULL;
int j = 0;
while((p->next)&&(j<i-1))//查找第i-1个结点,p指向该结点
{
p=p->next;
++j;
}
if(!(p->next)||(j>i-1)) //当i>n或n<1时,删除位置不合理
{
cout<<"ERROR"<<endl;
}
q=p->next;//临时保存被删除结点的地址以备释放
p->next=q->next;//改变删除结点前驱结点的指针域,等价于p->next=p->next->next;
delete q;//释放删除结点的空间
cout<<"删除成功!"<<endl;
}
int main()
{
//删除元素
int e;
cout<<"输入需要删除的值:";
cin>>e;
DeleteElem(L, e);
//删除第i个元素
// int i;
// cout<<"输入需要删除元素的序号:";
// cin>>i;
// ListDelete(L,i);
// DeleteIndex(L,i);
OutputList(L);
}