单链表的插入、删除、遍历(查找||改写数据)

数组的四个基本操作是增、删、改、查。
链表也是这样,学链表的第一步除了会用两种方法(头插和尾插)创建链表之外,剩下的就是学会增、删、改、查这四个基础操作。
不论进行哪种操作,链表的遍历是最最基础的,大框架如下:
node *p=head->next;(带头节点)
while( p )
{
操作;
p=p->next;
}
上篇博文对链表的遍历----查找做了一个简单总结
https://blog.csdn.net/CSDNGuoYuying/article/details/86591712
改写只需要在找到数据后将所在节点数据域的原有数据更新为要更改的数据即可。
这篇重点写一下链表删除和插入数据的代码。
插入数据
步骤:找到要插入的位置(遍历)---->建立新节点并写入要插入的数据---->链接新节点
链接新节点的核心代码

	addPrev->next=p->next;//连后面
	p->next=addPrev;//连前面

1.插在某数据之前

void addFront(node *head,int m,int mHold)//mHold为待插入数据
{
	node *p=head,*addPrev=NULL;//***********
	while(p)//遍历链表
	{

		if(p->next->a==m)//找到要插入的位置*************
		{
			addPrev=(node*)malloc(sizeof(node));
			addPrev->a=mHold;
			addPrev->next=p->next;
			p->next=addPrev;
			break;
		}
		p=p->next;//遍历
	}
	if(p==NULL)
		printf("插入位置有误!\n");	
}

2.插在某数据之后

void addBehind(node *head,int m,int mHold)//插在某数据之后
{
	node *p=head->next,*addPrev=NULL;//******************
	while(p)
	{
		if(p->a==m)//********************
		{
			addPrev=(node*)malloc(sizeof(node));
			addPrev->a=mHold;
			addPrev->next=p->next;
			p->next=addPrev;
			break;
		}
		p=p->next;
	}
	if(p==NULL)
		printf("插入位置有误!\n");
}

插在数据的前面和后面代码只区别于后面注释标***********的地方,看看就明白了~~~

删除数据
在程序中,没有删除这一概念,删除的本质是覆盖
体现在链表中,就是将要删除的节点用后一个节点覆盖
关键代码:

p->next=p->next->next;

以下为完整代码(实现删除链表中所有与待删除数据相等的数据)

void delNode(node *head,int m)//删除数据
{
	node *pLink=head->next,*pPrev=head;//pLink负责遍历链表且判断节点是否需要删除,pPrev执行删除操作
	while(pLink)
	{
		if(pLink->a==m)//找到要删除的数据
		{
			pLink=pLink->next;//将pLink向后移一位
			pPrev->next=pLink;//覆盖掉需要删除的节点
		}
		else
		{
			pLink=pLink->next;
			pPrev=pPrev->next;//如果数据无需删除,pPrev跟着pLink移动
		}
	}
}

以上if-else语句的意思是:
如果此数据需要删除,则pLink向后移,pPrev原地不动(一是方便pPrev->next=pLink的覆盖操作,二是再次循环时由pLink检查下一个数据是否也需要删除)
若此数据无需删除,则pPrev跟着pLink移动。

int main(int argc,char*argv[])
{
	node *head;
	int n;
	head=create_tail();//建立链表
	printf_Link(head);//输出

	scanf("%d",&n);//输入要删除的数据
	delNode(head,n);//调用函数
	printf_Link(head);//输出删除后的链表	
}

删除效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

csdnGuoYuying

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

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

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

打赏作者

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

抵扣说明:

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

余额充值