单链表 插入操作 和 删除操作 的易错点

单链表中的插入操作:

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个,如果使用与插入操作相同的循环条件,则会出现引用空指针的情况,使删除操作失败。

 代码实现:

  

  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值