数据结构 | C++ |链表的其他操作

本文包括:

  1. 链表的逆置
  2. 链表的排序
  3. 两个链表的合并

     

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指针域置空,

会引发如下错误:

posted @ 2019-04-13 12:31  心碎人俱乐部  阅读(11)  评论(0)    收藏  举报