c++第五版练习9.28

练习9.28 编写函数,接受一个forward_list<string>和两个string共三个参数。函数应在链表中查找第一个string,并将第二个string插入到紧接着第一个string之后的位置,若第一个string未在链表中,则将第二个string插入到链表的末尾。

分析:1.首先,要求是编写一个函数,有三个参数 ;

   2.要求在链表中进行操作,则说明更改了输入给函数的链表的相关信息;

    说明输入的链表需要使用引用,保证输入的链表在函数操作中被更改;得到的函数为:void MyFunc(forward_list<string>&flst,string strl1,string strl2)

        3.根据要求需要在链表中查找第一个string,判断是否出现,并且知道位置;说明首先需要对strl1进行遍历,找到strl1停止,或者找到链表末尾(指向链表最后一个元素的后面)仍未找到停止;

代码:

#include <iostream>
#include<forward_list>
#include<string>

using namespace std;
void myFunc(forward_list<string>&flst, string strl1, string strl2)
{
    auto prev = flst.before_begin();
    auto curr = flst.begin();
    while (curr != flst.end())  
    {
        if (*curr == strl1)                       //判断当前string是否与strl1相同
        {
            flst.insert_after(curr, strl2);
            return;
        }
        prev = curr;
        ++curr;
    }

    flst.insert_after(prev, strl2);  //prev指向最后一个元素,curr指向最后一个元素的后面,故该处使用prev
}

int main()
{
    forward_list<string> flist{"year","month","day","hour"};

    /*myFunc(flist, "year", "hello");    //在第一个元素的后面插入hello
    for (auto i : flist)
    {
        cout << i << endl;
    }*/

    /*myFunc(flist, "day", "hello");  //在day后面插入hello
    for (auto i : flist)
    {
        cout << i << endl;
    }*/

    myFunc(flist, "ok", "hello");  //元素列表中找不到ok,则会将hello插入到链尾
    for (auto i : flist)
    {
        cout << i << endl;
    }
    return 0;
}

 

        

posted on 2017-03-21 09:10  whitem  阅读(142)  评论(0编辑  收藏  举报