数据结构 | C++ |链表的其他操作
本文包括:
- 链表的逆置
- 链表的排序
- 两个链表的合并
1.逆序
//数组逆置
void LinkList::Invert()
{
//p起一个向导的作用,指引q依次前进
Node *p = elem->next;
Node *q = nullptr;
elem->next = nullptr;
while (p != nullptr)
{
q = p;
p = p->next;
q->next = elem->next;
elem->next = q;
}
}
2.链表的排序
Tips:
1.关于swap()函数,详见此处:https://www.cnblogs.com/love-yh/p/7365391.html
2.关于循环,需要两层循环.
内层循环:指针p从首元节点开始,比较当前data域和下一节点data域大小,如果是降序,通过swap()自带函数交换值.也就是冒泡排序
外层循环:bool型变量flag做一个标记,发生循环时保持为true,未发生循环时值为false.借此控制冒泡排序的循环次数.
//链表排序(按使用重量降序排列)
void LinkList::SortLinkList()
{
if (elem == nullptr||elem->next==nullptr)
{
cout << "是空表!\n"; return;
}
else
{
bool ischange = true;
while (ischange)
{
Node *p = elem->next; //每次while循环时,p重新设为原点
Node *q = nullptr;
ischange = false;
while (p->next != nullptr)
{
q = p;
p = p->next;
if (p->weight > q->weight)
{
swap(p->ActName,q->ActName);
swap(p->mood, q->mood);
swap(p->reps, q->reps);
swap(p->sets, q->sets);
swap(p->weight, q->weight);
ischange = true;
}
}
}
}
}
之前此部分一直错误,是因为未考虑到循环需要两层
Node *p = elem->next;//p指向首元节点
if (p == NULL)//判断空表
{
cout << "是空表!" << endl;
}
else if(p->next==NULL)//只有首元节点
{
cout << "只有一个元素:";
TravalLinkList();//打印此节点
}
else
{
bool isChange = true;
while (p->next->next != NULL&&isChange)//只写了一层循环
{
isChange = false;
if (p->data > p->next->data)
{
swap(p->data, p->next->data);
isChange = true;//本句执行时,说明排序未完成,循环继续
}
p = p->next;//p进一位
}
}
纸上得来终觉浅,绝知此事要躬行.
其他排序方式可见:https://www.cnblogs.com/TenosDoIt/p/3666585.html
3.两个链表的合并
由于是动态开辟空间(详见前一篇链表的基本操作 void CreateLinkList() ),不需要考虑固定数组长度的杂事
//合并链表
void LinkList::Merge(LinkList& LB)
{
Node *p = elem->next;
if (p = nullptr) { cout << "空表!\n"; return; }
while (p->next != nullptr)
{
p = p->next;
}
p->next = LB.elem->next;
LB.elem->next = nullptr;
}
如果不把形参Lb的elem的next指针域置空,
会引发如下错误:


浙公网安备 33010602011771号