在插入链表的时候,while§而在删除链表的时候while(p->next)?这是为什么呢?因为删除算法中的循环条件(p->next && j<i-1)和插入算法中的循环条件(p && j<i-1)是有所区别的。因为插入操作中合法的输入操作有 n+1个,而删除操作中合法的删除位置只有n个,如果使用与插入相同的循环条件,则会出现引用空指针的情况,使删除操作失败。
链表插入
/*单链表的插入
* 1、查找结点a_(i-1) 并由指针p指向该结点
* 2、生成1个新结点s
* 3、将新结点*s 数据域置为e
* 4、将新结点*s 的指针域指向结点a_i
* 5、将结点*p 的指针域指向新结点s
* */
Status ListInsert(LinkList &L,int i,ElementType e){
LinkList p = L;
int j = 0;
while(p && j<i-1){
p = p->next;
j++;
}
if(!p || j>i-1) return ERROR;//查找第i-1个新结点,p指向该节点
LNode* s = new LNode;
s->data = e;
s->next = p->next;
p->next = s;
return OK;
}
链表删除
/*单链表的删除
* 1、查找结点a_(i-1) 并由指针p指向该节点
* 2、临时保存待删除节点a_i 的地址在q中,以备释放
* 3、将结点*p 的指针域指向a_i的直接后继结点
* 4、释放结点a_i的空间
* */
Status ListDelete(LinkList &L,int i){
//带头结点的单链表L中,删除第i个元素
LinkList p = L;
int j =0;
while((p->next) && j<i-1){
p = p->next;
j++;
}
if(!(p->next) || (j>i-1)) return ERROR;
LNode *q = p->next;
p->next = q->next;
delete q;
return OK;
}