单链表的插入删除

单链表的插入删除

1.按位序插入(带头结点)

bool insert1(LinkList &L, int i, int e){
	if(i < 1){
		return false;
	}
	LNode *p;
	int j = 0;//j表示当前p指向的是第几个结点
	p = L;
	while(p != null && j < i - 1){
		p = p->next;
		j++;
	}
	if(p == null){
		return false;
	}
	LNode *s = (LNode *)malloc(sizeof(LNode));
	if(s == null){
		return false;//内存分配失败
	}
	s->data = e;
	s->next = p->next;
	p->next = s;
	return true;
}

封装后代码(把指定结点的后插操作封装成一个函数)

bool insert(LinkList &L, int i, int e){
	if(i < 1){
		return false;
	}
	LNode *p;
	int j = 0;//j表示当前p指向的是第几个结点
	p = L;
	while(p != null && j < i - 1){
		p = p->next;
		j++;
	}
	return nodeNextInsert(p, e);
}

封装后代码(把指定结点的后插操作封装成一个函数)

bool insert(LinkList &L, int i, int e){
	LNode *p = getElemLinkList1(L, i-1);
	return nodeNextInsert(p, e);
}

2.按位序插入(不带头结点)

bool insert2(LinkList &L, int i, int e){
	if(i == 1){
		LNode *s = (LNode *)malloc(sizeof(LNode));
		s->data = e;
		s->next = L;//新结点的next指针指向L指向的结点 //改(难理解)
		L = s;//头指针指向新结点 //改(难理解)
		return true;
	}
	LNode *p;
	int j = 1;
	p = L;//p指向第1个结点(注意:不是头节点)
	while(p != null && j < i - 1){
		p = p->next;
		j++;
	}
	return nodeNextInsert(p, e);
}

3.指定结点的后插操作

bool nodeNextInsert(LNode *p, int e){
	if(p == null){
		return false;
	}
	LNode *s = (LNode *)malloc(sizeof(LNode));
	if(s == null){
		return false;//内存分配失败
	}
	s->data = e;
	s->next = p->next;
	p->next = s;
	return true;
}

4.指定结点的前插操作

时间复杂度:O(1)

bool nodePriorInsert(LNode  *p, int e){
	if(p == null){
		return false;
	}
	LNode *s = (LNode *)malloc(sizeof(LNode));
	if(s == null){
		return false;//内存分配失败
	}
	s->next = p->next;//改
	p->next = s;//改
	s->data = p->data;//改
	p->data = e;//改
	//先插入再改数,而不是先改数再插入
	return true;
}

5.按位序删除

bool delete1(LinkList &L, int i, int &e){//改
	LNode *p = getElemLinklist1(L, i-1);
	if(p == null){
		return false;
	}
	if(p->next == null){
		return false;
	}//第i-1个结点后已无其他结点 //改(难理解)
	LNode *q = p->next;//改(令q指向被删除的结点)
	e = q->data;//改 //用e返回元素值
	p->next = q->next;//改
	free(q);(改)
	return true;
}

6.指定结点的删除

时间复杂度:O(1)

//删除指定结点p
bool delete2(LNode *p){//改
	if(p == null){
		return false;
	}//改
	LNode *q = p->next;//改 //令q指向*p的后继结点
	p->data = p->next->data;//改 //和后继结点交换数据域
	p->next = q->next;//改 //将*q结点从链中“断开”
	free(q);//改
	return true;//改
}//大改

如果p是最后一个结点的话,p–>next–>data这个地方会有bug。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

和安韩Pro

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值