链表的基本功能

水激石则鸣,人激志则宏。——秋瑾

1 . 基于上次写的学生管理链表,我做了一定的修改,把结构体的名称和数据域的名称修改了所以会和上次的不一样。
2 . 这次我们来继续完善链表中欠缺的功能,比如:替换插入删除封装等……
3 .若搞不清代码,可参考上期的博客:C++数据结构_单链表的实例剖析与应用1【6】

替换函数

分析

1 . 替换功能还是比较简单的。

2 .开始我是想到了两种方法,一种是将整个节点替换成新的,一种是将节点的中的数据域换成新的。但目前只实践了第二种方法,个人觉得还是很直白易懂的,第一种方法也可以用,但需要先使用delete删除实例化的节点,在重新赋值,

3 . 这里说一下整个实践过程:首先是找到这个要替换的节点,可以以数据域中的某一个数据为参照物,使用while循环来查找匹配,当匹配到了,就直接给该节点的数据域赋一个新值,还有一种情况,就是当头节点就是要被替换的节点,这种就直接使用if判断一下,是则直接替换头节点的数据域。
4 . 下面的图片应该会更加直白,这就相当于直接换了一个节点的数据域嘛。

代码实现与解析

1 . 多说无益,直接上代码。

2 . 创建一个函数ReplaceLinkNode()oidName为要被替换节点的参照物,newAgenewName为要替换的新值。
3 . 使用if判断一下头节点是不是要替换的节点。如果是,则直接直接将指针指向头节点的数据域,并赋予新的值替换掉,如果不是,则从头节点开始循环查找,直到找到为止并替换。
4 . 这里存在一个新的可能性:就是当链表不存在要找的节点参照物。这种情况都是在循环到达最后一个节点的时候发生的,我们只需要写个判断if(FindOut->Pointer_Next == nullptr),意思是访问最后一个节点的指针域是否为nullptr,是则输出“不存在目标”。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
void ReplaceLinkNode(string oidName, int newAge, string newName)
{
// LinkNodeBaseStruct * NewLinkNode = CreatLinkNode(newAge,newName);
if (HeadNode->Person_Name == oidName)
{
// LinkNodeBaseStruct *TempPointer = HeadNode -> Pointer_Next;
HeadNode->Person_Age = newAge;
HeadNode->Person_Name = newName;
// HeadNode -> Pointer_Next = TempPointer;
}
else
{
LinkNodeBaseStruct *FindOut = HeadNode;
while (FindOut->Person_Name != oidName && FindOut != nullptr)
{
FindOut = FindOut->Pointer_Next;
if (FindOut->Pointer_Next == nullptr)
{
cout << "没有找到要替换的目标" << endl;
}
}
if (FindOut != nullptr && FindOut->Pointer_Next == nullptr)
{
FindOut->Person_Age = newAge;
FindOut->Person_Name = newName;
}
}
}

5 . 以上是替换节点的操作,也不能完全说是替换节点吧,只是把数据域替换了。