2012-07-29 5 views
3

저는 C++에서 실습을하고 있으며 목록에서 요소를 제거하고 나머지는 왼쪽으로 옮기는 방법을 이해하려고합니다. 나는 깔끔한 해결책이 있는지 궁금해. 여기 내 버전, 일을 할 것 같다,하지만 난 더 나은 방법이 느낌이 :C++의 목록에서 요소 제거

Account AccountList::remove(int i){ 
if(i>=0 && i<size()) { 
    for (int n = i; n < size(); n++) { 
     if(i+1!=size()) { 
      aList[n]=aList[n+1]; 
     } 
    } 
    sz--; 
    return aList[i]; 
} else { 
    return Account(); 
} 
} 

답변

4

두 가지 문제가 있습니다.

  1. 제거 된 요소를 반환하지 않고 다음 요소로 덮어 쓰지 않고 반환합니다. 나는 이것이 당신의 의도라고 생각하지 않습니다.
  2. 루프 범위가 올바르지 않습니다. 이 루프를 사용하면 n = size() - 1 인 경우 색인 n + 1을 사용하여 배열 경계를지나 가게됩니다.

수정 된 내용이 아래에 나와 있습니다.

Account AccountList::remove(int i) 
{ 
    if(i>=0 && i<size()) 
    { 
    Account a = aList[i] 
    for (int n = i; n < size() - 1; n++) 
    { 
     if(i+1!=size()) 
     { 
      aList[n]=aList[n+1]; 
     } 
    } 
    sz--; 
    return a; 
    } else 
    { 
    return Account(); 
    } 
} 
1

당신이이 일을하는 경우, 당신은 제대로 목록을 구현 아닙니다. 요소를 제거하려면 목록의 복잡도가 O(1) 여야합니다. 그것은 배열이나 벡터처럼 보입니다.

일반적으로 목록은 서로 연결된 노드로 구성되며,이 경우 문제가되는 노드를 삭제하고 삭제하려는 노드의 이전 노드가 노드를 가리 키도록하면됩니다.

+2

목록이 링크 된 목록 일 필요는 없습니다. 어레이를 백 엔드 구조로 사용하는 것은 허용됩니다. –

+1

'목록'이 연결된 목록을 의미 할 수 있다고 가정하더라도 (왜 [skiplist] (http://en.wikipedia.org/wiki/Skiplist) 또는 [arraylist] (http : // en.wikipedia.org/wiki/Arraylist)?) 연결된 목록에는 O (n) 조회로 인해 임의 요소에 대한 O (1) 제거가 없습니다. – Grizzly

+0

@ Grizzly 예,하지만 이미 노드 제거 포인터가 있다고 가정하고있었습니다. 이 경우에는'begin() + n'이됩니다. –