数组的四个基本操作是增、删、改、查。
链表也是这样,学链表的第一步除了会用两种方法(头插和尾插)创建链表之外,剩下的就是学会增、删、改、查这四个基础操作。
不论进行哪种操作,链表的遍历是最最基础的,大框架如下:
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);//输出删除后的链表
}