单链表中的插入操作:
Status ListInsert(LinkList &L,int i,Elemtype e){
cout<<"在第"<<i<<"个位置插入元素"<<e<<"后:"<<endl;
//查找操作
LinkList p=L; int j=0;//j指的是当前p指向的是第几个结点
while( p && (j<i-1) ){
p=p->next; ++j;//查找第i-1个结点,p指向该结点
}
if(!p||j>i-1)return ERROR;
//插入操作
LinkList s=new LNode;//生成新结点
s->data=e;//将结点*s的数据域置为e
s->next=p->next;//将结点*s的指针域指向p指针域原来指向的元素
p->next=s;//将结点*p的指针域指向结点*s
return OK;
}
单链表的删除操作:
Status ListDelete(LinkList &L,int i){
cout<<"删除第"<<i<<"个元素后:"<<endl;
//查找操作
LinkList p=L; int j=0;//j指的是当前p指向的是第几个结点
while( (p->next) && (j<i-1) ){
p=p->next; ++j;
}
if( !(p->next) || (j>i-1) )return ERROR;
//赋值操作
LinkList q=p->next;//临时保存被删除结点的地址到指针q里以备释放
p->next=q->next;//改变删除结点 前面结点的指针域(跳过删除的结点直接指向下一个)
delete q;//释放删除结点的空间
return OK;
}
我们注意这里两者循环条件不同:
插入:从头结点开始(n+1个)
while( p && (j<i-1) )
删除:从首元结点开始(n个)
while( (p->next) && (j<i-1) )
插入算法中的循环条件( p && (j<i-1) )与删除算法中的循环条件( (p->next) && (j<i-1) )是有所不同的。因为插入操作中合法的插入位置有n+1个,而删除操作中合法位置只有n个,如果使用与插入操作相同的循环条件,则会出现引用空指针的情况,使删除操作失败。
代码实现: