前言
在上篇文章【数据结构】伪链表查找节点的两种方法(内容充实)中介绍了伪链表中查找节点的两种方法,在这篇文章中我们将介绍伪链表的增、删、改三种操作,而且在改的操作中要用到上篇文章中查找节点的相关函数。
我们在文章【数据结构】伪链表的链接和遍历(思路才是精华,别错过)
中定义了一个结构体并且结构体的第二个元素装的是下一个节点的地址,节点之间就是通过这个元素链接起来,所以接下来文章中的增删改都是针对这个结构体的第二个元素进行的。
struct Code
{
int data;
struct Code* pnext;
};
上篇文章中我们将a、b、c、d四个节点链接在一起如下图所示
struct Code a = { 3,NULL },
b = { 3,NULL },
c = { 8,NULL },
d = { 3,NULL };
//首先将a元素的地址赋值给phead
struct Code* phead = &a;
while(phead != NULL)
{
phead = phead->pnext;
}
一、增加节点
头增加
现在我们在 a a a的前面再添加一个节点 e e e如图所示
增加节点 e e e:将节点 e e e中的第二个元素装上节点 a a a的地址,就将节点 e e e与链表链接起来
//定义一个结构体变量e
struct Code e = {12,NULL};
//将e链接到a的头部
e.pnext = &a;
尾增加
在 d d d尾部增加一个节点 g g g如图所示
增加节点 g g g:将节点 d d d中的第二个元素装上节点 g g g的地址,就将节点 g g g与链表链接起来
//定义一个结构体变量g
struct Code g = {145,NULL};
//将g链接到d的尾部
d.pnext = &g;
中间添加
在 b b b和 c c c中间增加一个节点 f f f如图所示
增加节点 f f f:将节点 b b b中的第二个元素装上节点 f f f的地址,将节点 f f f中第二个元素装上节点 c c c的地址,就将节点 f f f与链表链接起来
//定义一个结构体变量f
struct Code f = {564,NULL};
//将b与f链接起来
b.pnext = &f;
//将f与c链接起来
f.pnext = &c;
二、删除节点
在真正的链表中节点的地址都是通过 m a l l o c malloc malloc来申请的,所以在删除节点后要注意将申请的空间用 f r e e free free释放掉。
头删除
删除节点 a a a:节点 a a a中的第二个元素原来装的是节点 b b b的地址,将节点 a a a中第二个元素即下一个节点的地址赋值为NULL,节点 a a a自然就会与节点 b b b断开
a.pnext = NULL;
尾删除
删除节点 d d d:节点 c c c中的第二个元素原来装的是节点 d d d的地址,将节点 c c c中第二个元素即下一个节点的地址赋值为NULL,节点 c c c自然就会与节点 d d d断开
c.pnext = NULL;
中间删除
删除节点 c c c:将节点 b b b中第二个元素直接赋值上节点 d d d的地址,那么就将节点 c c c与链表断开,将节点 b b b与节点 d d d链接起来
b.pnext = &d;
三、更改节点
想要更改节点首先要通过遍历链表找到节点然后才能更改节点上的值
通过数据查找并更改节点
//第一个参数是链表头地址,第二个参数是需要查找的节点上的数据,第三个参数是想要更换的数据
void change_data(struct Code* phead,int data,int change_data)
{
//定义一个中间变量装着通过数据找到的节点的地址
struct* ptemp = find_data(phead, data);
if (ptemp != NULL)
{
//将节点上的数据更改为想要的数据
ptemp->data = change_data;
}
}
通过下标查找并更改节点
//第一个参数是链表头地址,第二个参数是需要查找的节点的下标,第三个参数是想要更换的数据
void change_index(struct Code* phead,int index,int change_data)
{
//定义一个中间变量装着通过下标找到的节点的地址
struct* ptemp = find_index(phead,index);
if(ptemp != NULL)
{
//将节点上的数据更改为想要的数据
ptemp->data = change_data;
}
}
接下来只需在主函数中进行调用即可
总结
本篇文章和前面的两篇文章均是介绍伪链表的相关知识,并且在内容上就有连贯性,本篇文章中并没有给出主函数框架,因为在前面两篇文章中已经进行了详细的介绍,所以本文就只介绍了伪链表的增删改相关的知识和函数。
读者要将这三篇文章按顺序放在一起来看,会有很大的收获。
【数据结构】伪链表的链接和遍历(思路才是精华,别错过)
【数据结构】伪链表查找节点的两种方法(内容充实)
另外,伪链表并不算正真意义上的链表,它只是形象的引出了链表的相关概念和操作,但是对伪链表相关知识的学习会对后边真正链表的理解和学习打下基础。