删除第i个节点
封装会更简单
//删除第i个位置元素并返回第i个元素的值
bool ListDelete(LinkList &L,int i,int &e)
{
if(i<1) return false;
LNode *p;//p表示当前扫描到的节点
p=L;
int j=0;
while(p!=NULL&&j<i-1)//找到第i-1个元素
{
p=p->next;
j++;
}
if(p==NULL||p->next==NULL) return false;
LNode *s=p->next;//s表示第i个元素
e=s->data;
p->next=s->next;
free(s);
return true;
}
删除指定节点p
//删除指定节点p,
bool DeleteNode(LNode *p)
{
if(p==NULL) return false;
LNode *q=p->next;
p->data=q->data;//交换数据,但若p是最后一个节点会出错,只能换方法找前驱
p->next=q->next;//删除p的后继节点
free(q);
return true;
}
按位查找
//按为查找,返回第i个元素(带头结点)
LNode * GetElem(LinkList L,int i)
{
if(i<0) return false;
LNode *p=L;
int j=0;
while(p!=NULL&&j<i)//找第i个元素
{
p=p->next;
j++;
}
if(p==NULL) return false;
return p;
}
按值查找
//找到数据域为e的节点,o(n)
LNode *LocateElem(LinkList L,int e)
{
LNode *p=L->next;//从第一个节点开始查找
while(p!=NULL&&p->data!=e)
{
p=p->next;
}
return p;
}