2011-08-30 3 views
-2

linked list을 사용하는 FIFO 프로그램입니다. 프로그램은 원하는 결과를 제공하지 않지만 언젠가 후에 멈추고 프로그램이 작동을 멈추었다는 메시지가있는 긴 루프를 생성합니다. 문제가 무엇입니까?프로그램이 원하는 출력을 제공하지 않습니다. 잘못된 FIFO 구현?

#include <iostream> 
using namespace std; 

struct node { 
     int data; 
     struct node* previous; // This pointer keeps track of the address of the previous node 
}; 

struct queue { 
     node* first; 
     node* last; 
}; 

node* dataNode_P_A; 

bool loop = true; 

struct node* enterData(); 
struct node* enter_N_Data(); 
void displayQueue(); 

int main() { 
    struct node* dataNode= enterData(); 

    while(loop) { 
     cout << "Want to enqueue ? Press y/n : "; 
     char ans; 
     cin >> ans; 
     if(ans == 'y') { 
      struct node* dataNode_N = enter_N_Data(); 
     } else { 
      break; 
     } 
    } 

    displayQueue(); 
} 

struct node* enterData() { 
    cout << "Enter the number : "; 
    dataNode_P_A = new node; // Now dataNode points to a chunk allocated to node 
    cin >> dataNode_P_A->data; 
    dataNode_P_A->previous = NULL; // this is set to NULL because no one follows till now 
    queue* q = new queue; 
    q->first = dataNode_P_A; // this pointer points to the first element 
    return dataNode_P_A; 
} 

struct node* enter_N_Data() { 
    cout << endl << "Enter the number : "; 
    node* dataNode = new node; 
    cin >> dataNode->data; 
    dataNode->previous = dataNode_P_A; 
    queue* q = new queue; 
    q->last = dataNode; // this pointer points to the last element 
    return dataNode; 
} 

void displayQueue() { 
    while(dataNode_P_A != NULL) { 
     cout << dataNode_P_A->data << endl; 
     dataNode_P_A++; 
    } 
} 
+3

이전 노드에 대한 포인터 만있는 링크 된 목록을 보지 못했습니다. N –

+0

음, 이상합니다. 일반적으로 이전 연결 목록이 아닌 단일 연결 목록에서 다음 노드를 추적합니다. – trojanfoe

+0

원하는 출력은 무엇입니까? 실제 출력은 무엇입니까? 정확히 어디에서 작동이 멈 춥니 까? 디버거를 작동시킬 시간. – razlebe

답변

6

당신은 queue의를 구성하고이를 포기한다. 당신이 로 순전히 목록를 구성하지 않도록

당신은, dataNode_P_A를 업데이트하지 못한다.

의미가 분명하지 않으면 dataNode_P_A++을 호출합니다.

길고 복잡하지 않은 코드를 테스트하지 않고 작성했습니다.

처음부터 다시 시작해야합니다.

+0

Oooh, good catch - enterData와 Enter_N_Data가 둘 다 dataNode_P_A를 업데이트하지 않는다는 사실을 놓쳤습니다. –

4

시작 위치 ... 먼저 큐 데이터 구조가 특별히 사용되지는 않습니다. 그러나 그것은 당신의 문제의 근원이 아닙니다. 즉 여기있다 :

void displayQueue() { 
    while(dataNode_P_A != NULL) { 
     cout << dataNode_P_A->data << endl; 
     dataNode_P_A++; 
    } 
} 

링크 된 목록을 반복, 당신이 이동하여 다음 요소로 이동 -> 이전 :

void displayQueue() { 
    while(dataNode_P_A != NULL) { 
     cout << dataNode_P_A->data << endl; 
     dataNode_P_A = dataNode_P_A->previous; 
    } 
} 

, 당신은 다른 일을하고 있다는 것을 말해 두 겠는데 그 글로벌 목록 (dataNode_P_A)을 수정하는 것처럼 의심 스럽습니다. 그것은 당신의 예제에서는 문제가 아니지만 그것을 표시하는 것 외에 다른 것을 원하는 경우 문제가 될 수 있습니다. 당신처럼 enter_N_Data() 기능을 편집해야

void displayQueue() { 
    node *entry = dataNode_P_A; 
    while(entry != NULL) { 
     cout << entry->data << endl; 
     entry = entry->previous; 
    } 
} 
+1

"-> previous"로 이동하여 다음 요소로 이동하십시오. 기억하기 쉽고 사용하기 쉽습니다. – unkulunkulu

+0

'displayQueue' 함수는'dataNode_P_A'가 절대로 변경되지 않기 때문에 ** 입력 된 첫 번째 숫자 만 항상 ** 표시합니다. 어떻게 극복 할 수 있습니까? –

+0

나는 dataNode_P_A가 null이되지 않을 것입니다. 왜냐하면 enterData는 하나의 dataNode_P_A 요소를 생성하기 때문에 질문에 혼란 스럽습니다. –

0

:

node* temp; // global as others in your program 

struct node* enter_N_Data() { 
cout << endl << "Enter the number : "; 
node* dataNode = new node; 
cin >> dataNode->data; 
temp = new node; 
temp = dataNode_P_A; 
dataNode_P_A = dataNode; // update dataNode_P_A 

dataNode->previous = temp; 

queue* q = new queue; 
q->last = dataNode; // this pointer points to the last element 
return dataNode; 
} 

과에 의해 제안을 다음과 같은 동안 같은 모든 것을 유지 여기

는 문제가되지 않습니다 displayQueue의 또 다른 버전입니다 @ Larry Osterman 및 @ Beta.

관련 문제