C++ 数据结构算法 学习笔记(4)-链表 续
单链表的遍历
代码例子:
void Link_print(LinkList*& L)
{
LinkNode* p = NULL;
if (!L)
{
cout << "This list is NULL!" << endl;
return;
}
p = L->next;
while (p)
{
cout << p->data<<" ";
p = p->next;
}
}
单链表获取元素
代码例子:
bool Link_GetElem(LinkList*& L, int i, int& e) //Single List get element
{
int index;
LinkList* p;
if (!L || !L->next) return false;
p = L->next;
index = 1;
while (p && index < i) //list scanned to behind, until the p pointing to the i element or p is NULL
{
p = p->next; //p pointing to the next node
index++;
}
if (!p || index>i )
{
return false;
}
e = p->data;
return true;
}
这个代码的底层逻辑是循环while (p && index < i)
会将p
指针指向该元素,然后再直接取指针的值.
其中,也有写上防御性编程, 比如当客户输入i
值为负数的时候,while
循环将不会执行,这样使得程序会进入下一个if
判断(原因是 index>i
). 然后程序将返回false
另外,如果用户输入要取元素的值大过链表的大小时,程序也会返回false
. 原因是p
将会是NULL
,然后程序会进入if
判断输出false
单链表查找元素
代码例子:
bool Link_FindElem(LinkList* L, int& index, int e)
{
LinkList* p;
p = L->next;
index = 1;
if (!L || !L->next)
{
index = 0;
return false;
}
while (p && p->data != e)
{
p = p->next;
index++;
}
if (!p)
{
index = 0;
return false;
}
return true;
}
这个代码的实现逻辑是while
循环会一直寻找元素为 e
的链表.
具体实现为当第一个节点的元素不是e
的话,会进入while
循环里使得指针p
指向下一个节点,直到指到元素为e
的节点时会退出循环,然后由于index
是引用所以会直接把main
函数里定义的index
值修改.
由于index
的值不可能为0, 所以当程序没找到e
的值的话会把index
返回为0
单链表删除元素
代码例子:
bool LinkDelete(LinkList*& L, int i)
{
LinkList* p, * q;
int index = 0;
p = L;
if (!L || !L->next)
{
return false;
}
while ((p->next) && (index < i - 1))
{
p = p->next;
index++;
}
if ((!p->next) || (index > i - 1)) //When i>n or i<1, delete position is not valid
{
return false;
}
q = p->next;
p->next = q->next;
delete q;
}
代码的实现逻辑为, 当用户想要删除第二个节点的时候,此时我们需要让一个指针指向第一个节点.
这个原因是一旦我们让指针指向第一个节点的时候我们才可以直接修改第一个节点的指针域以便让它指向原本第三的节点.
这样的话我们才可以直接删除掉第二个节点.
另外,我们一定要记得加上代码delete q
以便不会有内存泄漏的问题发生
单链表销毁
代码例子:
void LinkDestroy(LinkList*& L)
{
//define a temporary node p to poiting to the head node
LinkList* p = L;
cout << "Delete the entire list" << endl;
while (p)
{
L = L->next;
cout << "Deleting the list" << endl;
delete p;
p = L;
}
}
这个代码的实现逻辑是让一个指针p
在while
里面循环,若p!=NULL
的话就会删除掉该p
当然我们需要另一个指针L
以便当我们删掉p
内存是还能将p
赋值到下一个节点的地址L