2015-01-16 3 views
0

내 문제는 push_backs()의 사용에 있다고 생각하지만이 문제를 해결하는 간단한 방법은 생각할 수 없습니다. 내가 arguements에 주어진 두 ints에서 노드를 교환해야합니다, 나는 어떤 도움을 주셔서 감사합니다! 나는 대학의 신입생으로 세계에 나가 오늘, 그리고 의견을 공개합니다!Singly Linked List 스왑 함수 (int, int)

void MyList::swap(int i, int j) 
{ 
    if (i == j || i > size() || j > size()) return; 

    Node *temp = head; 
    delete head; //pretty sure this is what's giving me issues as well 

    for (unsigned x = 0; x < size(); x++) 
    { 

     if (x == i) 
     { 
     int y = 0; 
     for (Node *itt = head; itt; itt = itt->next) 
     { 
      if (y == j) 
       push_back(itt->value); 
      y++; 
     } 
     } 
     else if (x == j) 
     { 
     int y = 0; 
     for (Node *itt = head; itt; itt = itt->next) 
     { 
      if (y == i) 
       push_back(itt->value); 
      y++; 
     } 
     } 
     else 
     { 
     push_back(temp->value); 
     } 

     temp = temp->next; 
    } 
} 

은 참조를 위해, 여기에 노드 클래스 내가 당신보다 더 나은 방법이 있다고 생각

using namespace std; 
    class Node 
    { 
    public: 
     char value; 
     Node *next; 
     Node(char value) 
     :value(value), next(0) 
    {} 
    }; 
+0

예,'head'가 이어질 것입니다 삭제 [* 정의되지 않은 행동 *] (http://en.wikipedia.org/wiki/Undefined_behavior) 때 나중에 head''역 참조. 왜 헤드 노드의 메모리를 해제하고 싶습니까? 특히 나중에 사용하려고 할 때? –

+0

MyList는 "head"로 정의되어 있으므로 전체 목록에 추가 할 수 없습니다. 하하 – Marksman46

+1

[작은 프로그램 디버깅] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)에서이 기사를 읽어야합니다. –

답변

2

i 번째와 j 번째 노드의 값을 바꿀 수 있습니다.

void MyList::swap(int i, int j){ 
    if(head == NULL) return; 

    // Get ith node 
    node* node_i = head; 
    int node_cnt = 0; 
    while(1){ 
    if(node_cnt == i) break; 
    if(node_i == NULL) return; 
    node_i = node_i->next; 
    node_cnt++; 
    } 

    // Get jth node 
    node* node_j = head; 
    node_cnt = 0; 
    while(1){ 
    if(node_cnt == j) break; 
    if(node_j == NULL) return; 
    node_j = node_j->next; 
    node_cnt++; 
    } 

    // Swap values of nodes 
    int temp = node_i->value; 
    node_i->value = node_j->value; 
    node_j->value = temp; 
} 
+0

이 예제에서는 값만 바꿀 수 있습니다. Node의 구현이 변경되면 (Open/Closed 원칙을 위반하는 경우) 변경해야합니다. – Mustafa

+0

끝 부분의 아주 작은 실수를 제외하고는 아주 훌륭합니다. 훌륭하게 작동합니다. 결코 그렇게 생각하지 않았습니다! 너무 감사합니다! – Marksman46

+0

아 맞습니다. 다행히 도울 수있어. –

0

입니다. 정말로 delete은 필요하지 않습니다. i 번째 노드 앞의 노드 (있는 경우)와 j 번째 노드 앞의 노드에 대한 포인터 (있는 경우)에 대한 포인터 만 가져올 필요가 있습니다. 그럼 스왑을해라.

관련 문제