2013-11-01 4 views
1

포인터에 대한 모든 링크를 확인했지만 처리되지 않은 예외가 계속 발생하여 inter 위치 바로 다음에 노드를 삽입하는 데 문제가 있습니다. 다 맞 앗어. 누구든지 내 코드를보고 무엇이 잘못 됐는지 보겠습니까?deque 클래스의 iter 위치 뒤에 노드를 삽입하십시오.

void insert_after(DequeIterator<E>& iter, E x) 
{ 
    if(_size == 0) 
    { 
     insert_front(x); 
    } 
    else 
    { 
     assert(!iter.at_end()); 

     // need to check, if its the iter is the last element 
     // do insert_back instead 
     if(iter.node() == _tail) 
      insert_back(x); 
     else 
     { 
      // create a temp2 pointer to hold the address of iter 
      DNode<E>* temp2 = iter.node(); 
      // set temp2 equal to the address of the node after 
      // iter before inserting 
      iter.node()->next()->set_next(temp2); 
      // create a new node to insert 
      DNode<E>* temp = new DNode<E>(iter.node(), x, temp2); 
      // set the iter->next to hold the address of the new node 
      iter.node()->next()->set_next(temp); 
      //set the address of temp2->prev to hold the address 
      // of the new node. 
      // This is also where I got the exception error !!!! 
      temp2->prev()->set_prev(temp); 
      _size++; 
     } 
    } 
} 
+1

독자적인 deque 구현입니까? 그렇다면 코드를보기 좋게 만한다면이 코드는별로 도움이되지 않습니다. – edorado

답변

1

내 일반적인 생각. 실제로 노드에서 반복 작업을 수행하지 않으므로 여기서 왜 반복자가 필요합니까? 참고 문헌이나 포인터도 마찬가지입니다. 내 노드를 초기화 할 것입니다.

DNode<E>* temp = new DNode<E>(iter.node(), x, iter.node()->next()); 
// Initialize new node inbetween previous nodes 
temp->prev()->set_next(temp); temp->next()->set_prev(temp); 
// Cut ties between nodes to avoid cycles. 

왼쪽은 이전이고 오른쪽은 다음이라고 가정합니다. 그럼 당신이해야 할 일은 그 다음에 반복됩니다. 또한 귀하의 변수 종류는 그들이 무엇인지 기억하는 측면에서 현장에 넣어. 이 코드에서 현재 노드를 가져온 다음 노드를보고 난 후 노드를 말하고있는 것처럼 보입니다. 그런 다음 현재 노드를 사용하여 새 노드를 그 전후에 초기화합니다. 그런 다음 새 노드를 현재 노드가되어야하는 노드로 이동하고 현재 노드를 이전 노드로 설정합니다. 이것은 함수가 내 마음이 생각한대로 이중 링크 목록에 대해 수행 할 것으로 가정합니다. 값 x

1
a 가리키는 iter와 당신은 순서 a, c

제안 된 해결, 당신이 원하는 a, b, c 바로 그 새로운 노드 b에 저장? 모든 노드에는 prevnext 포인터가 있습니다.이 포인터는 해당 이름의 메소드를 사용하여 읽을 수 있으며 setter 메소드로 설정할 수 있습니다.

DNode<E>* a = iter.node(), c = a->next(); // both ends of the insert location 
DNode<E>* b = new DNode<E>(a, x, c);  // assuming constructor sets pointers 
a.set_next(b); 
c.set_prev(b); 

문제 분석

이제 왜 코드가 실패 않습니다 그런 다음이 시도?

iter.node()->next()->set_next(temp2); 

cnext 포인터를 수정하는? 그것은 그대로 남아 있어야합니다!

iter.node()->next()->set_next(temp); 

같은 문제. 게다가 이것은 이전 호출을 덮어 쓰는 것처럼 보이므로 무의미한 것처럼 보입니다.

temp2->prev()->set_prev(temp); 

그리고 지금 당신은 a 전에 노드의 prev 포인터를 수정하는? 더 나쁜.

+0

도움을 많이 주셔서 감사합니다. –