2014-02-25 3 views
0

내가하고 싶은 것은 단일 링크 된 목록의 마지막 요소를 k 번째로 찾는 것이다. I 아래 순환 용액이 다음 main() 함수에서 를, I는 I 목록을 작성한 후,이 test_func 전화 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; 
} 

에 번호 10 채리스트를 생성한다. 반환 값은 내가 원하는 요소의 반복자 여야합니다.

#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만큼 증가시키고 old 값을 반환합니다.

필요한 것은 사전 증가분 : ++iter입니다. 즉, 하나씩 반복하고 값을 반환합니다.

+0

정말 고마워요! 또 다른 질문이 있습니다. 이 예에서는 forward_list 만 인수로 사용합니다. 좀 더 일반화 할 수 있을까요? 목록에있는 데이터는 내가 알지 못하는 다른 데이터 구조 일 수 있습니다. –