2014-02-25 99 views
0

我想要做的是找到單個鏈表的最後一個元素。我有下面的遞歸溶液: 在main()函數中,我創建保持數10的列表,以1迭代器不能停在最後(C++)

int main() 
{ 
int i; 
forward_list<int> flist; 
for (i = 1; i <= 10; i ++) 
    flist.push_front(i); 

forward_list<int>::iterator iter; 
cout << "Original Sequence:" << endl; 
for (iter = flist.begin(); iter != flist.end(); iter ++) 
    cout << *iter << " "; 
cout << endl; 

forward_list<int>::iterator end = flist.end(); 
forward_list<int>::iterator begin = flist.begin(); 
forward_list<int>::iterator ret; 

ret = test_func(begin, end); 
cout << "The " << TARGET << "th(st,nd,rd) to last element is " << *ret << endl; 
return 0; 
} 

我創建的列表後,我打電話test_func。返回值應該是我想要的元素的迭代器。

#define TARGET 3 
static int counttt = 0; 

forward_list<int>::iterator test_func(forward_list<int>::iterator iter, forward_list<int>::iterator end) 
{ 

cout << "test..." << endl; 

forward_list<int>::iterator temp; 
if ((iter ++) != end) 
    temp = test_func(iter, end); 
counttt ++; 
if (counttt < TARGET) 
    return end; 
else if (counttt == TARGET) 
    return iter; 
else 
    return temp; 
} 

「test ...」用於調試,它告訴我調用了test_func()的次數。在我看來,test_func()應該被調用10次。但是,它將被呼叫11次,最後一次會導致分段錯誤。我覺得((iter ++)!= end)不會在正確的時間發生。

所有的代碼如下所示:

#include <forward_list> 
#include <iostream> 
#include <algorithm> 
#include <stdlib.h> 

using namespace std; 

#define TARGET 3 
static int counttt = 0; 

forward_list<int>::iterator test_func(forward_list<int>::iterator iter, forward_list<int>::iterator end) 
{ 

cout << "test..." << endl; 

forward_list<int>::iterator temp; 
if ((iter ++) != end) 
    temp = test_func(iter, end); 
counttt ++; 
if (counttt < TARGET) 
    return end; 
else if (counttt == TARGET) 
    return iter; 
else 
    return temp; 
} 

int main() 
{ 
int i; 
forward_list<int> flist; 
for (i = 1; i <= 10; i ++) 
    flist.push_front(i); 

forward_list<int>::iterator iter; 
cout << "Original Sequence:" << endl; 
for (iter = flist.begin(); iter != flist.end(); iter ++) 
    cout << *iter << " "; 
cout << endl; 

forward_list<int>::iterator end = flist.end(); 
forward_list<int>::iterator begin = flist.begin(); 
forward_list<int>::iterator ret; 

ret = test_func(begin, end); 
cout << "The " << TARGET << "th(st,nd,rd) to last element is " << *ret << endl; 
return 0; 
} 

感謝,

凱文周

回答

3

你有什麼是後遞增:iter++。這意味着:將iter增加1,並返回舊的值。

你需要的是預增量:++iter。這意味着:通過一個驗證並返回新值值。

+0

非常感謝你!!!我還有另外一個問題。本示例僅將forward_list 作爲參數。我可以使它更一般嗎?列表中的數據可能是其他一些我不知道的數據結構。 –