例题:C++中删除链表中的奇数元素

来源:互联网 发布:sqlserver安装错误 编辑:程序博客网 时间:2024/06/05 18:45

C++中表示链表的容器是forward_list。

首先给链表赋一个初始值,用列表初始化的方法:forward_list lst{1,2,3,4,5,6,7};

删除链表中元素的语句是erase_after。如lst.erase_after(iter),iter是一个迭代器,和erase语句不同的是,erase删除的是这个迭代器所指元素,而erase_after删除的是迭代器所指后面的那个元素。

判断一个数是否为奇数用的是指向这个数的迭代器,但我们只能删除这个迭代器之后的元素。怎么办呢?c++还提供了before_begin(),它指的位置是第一个元素之前的位置,和end()感觉差不多。假如我们判断出来了第一个元素是奇数,要删除它,那么就:auto it = lst.before_begin();再lst.erase_after(it);按照这个思路类推。

整体流程大概是:从链表最开始,我们需要两个迭代器,一个指着第一个元素,叫做iter。一个指向第一个元素之前的元素,叫做iter_begin。我们使用iter依次判断每个元素是否是奇数,直到到达end为止。

如果是奇数,那么就erase_after(iter_begin)。然后要移动迭代器的位置使它们接着判断。erase_after返回了被删除元素的下一个位置,所以我们要让iter等于它,也就是iter = lst.erase_after(iter_begin)。我们不需要移动iter_begin的位置。

如果不是奇数,就要移动两个迭代器继续判断。iter_begin和iter都++。

这是大体思路。

我的代码如下:

#include <iostream> 
#include <forward_list>
using namespace std;

int main()
{
forward_list<int> lst{1,2,3,4,5,6};
auto iter_begin = lst.before_begin();
auto iter = lst.begin();
while (iter != lst.end())
{
if(*iter%2==1)
{
iter=lst.erase_after(iter_begin);
}
else
{
iter_begin++;
iter++;
}
}
for (auto it : lst)
cout << it << endl;
system("pause");
return 0;
}

0 0
原创粉丝点击