2013-12-10 2 views
0

다음과 같이 파트 B. 나는 구조체 노드를 부여하고, 나는 현재 스탠포드 열린 CS106B을 통해 내 방식을 일하고 있어요, 나는 할당 3에 문제가 실행 해요 :내 목록의 반복이 실패하는 이유는 무엇입니까?

struct Node { 
string name; // my person's name 
string killer; // who eliminated me 
Node* next; // ptr to next node 
Node(string name, Node* next) {...} 
}; 

내가 구현해야 노드 목록을 만드는 클래스. 생성자가 제대로 작동하지만 목록을 반복 할 때 프로그램이 중단됩니다. 내 반복 코드 : 나는 루프 내가 아는 횟수를 A의 루프를 사용하는 경우

void AssassinsList::printGameRing() { 
    Node* current; 
    for(current = ring; current->next != NULL; current = current->next) { 
     cout << endl << " " << current->name << " is targeting " << current->next->name; 
    } 
    cout << endl << " " << current->name << " is targeting " << ring->name << endl; 
} 

그러나, 나는 특정 목록 길이 필요, 그것을 작동합니다. 도움? 과제에 대한 링크 pdf : http://www.stanford.edu/class/cs106b/homework/3-tiles-assassins/spec.pdf

고마워!

+0

내가 제공 한 코드에 어떤 오류라도 발견 할 수 없습니다. 더 많은 코드를 보여야합니다. –

+0

printGameRing에서 "next"를 처리하지만 구조체 (표시)에는 해당 멤버가 없습니다. 관련 파트를 표시하지 않으면 어떻게 도와 드릴까요? –

+0

그는 current-> next! = NULL보다 먼저 확인하여 current-> next가 thee가 될 것입니다 – sam

답변

2

* next에서 nullptr까지 초기화하지 않는 것으로 추측됩니다. 따라서 노드 사이에 설정 한 모든 링크에 대해서는 괜찮지 만 목록의 마지막 객체는 쓰레기를 가리 킵니다.

죄송합니다. nullptr은 (는) C++ 11입니다. 귀하의 컴파일러가 이전의 경우 그저 NULL.

+0

아 ... 네 말이 맞다. 루프에 너무 많이 집중하여 첫 번째 다음 포인터가 대상으로 설정되었지만 대상이 null로 설정되지 않았 음을 알았습니다. 감사! – br1992

0

cur이 NULL이거나 아무것도 가리 키지 않으면 잘못된 포인터를 역 참조하여 프로그램을 중단시킬 수 있습니다. 다른 옵션은 woolstar가 지적했듯이, 당신은 당신의 목록에서 종단 노드가 없다는 것입니다 다음 코드 관찰 (포인트 NULL로하는 것이 있습니다.) :

Node* head = new Node{0}; 
Node* cur = head; 
for (int i = 1; i <= 10; i++) 
{ 
    cur->next = new Node{i}; 
    cur = cur->next; 
} 

// Set terminating node 
cur->next = nullptr; 

// We'll iterate until cur is null 
// So if we access cur->next 
// It won't result in undefined behavior 
for (cur = head; cur != nullptr; cur = cur->next) 
{ 
    std::cout << cur->value; 
} 

// cur should be nullptr now 
if (!cur) 
    std::cout << "end of list"; 
0

당신도 그래 0을 ​​사용할 수 있습니다를, 그렇지 않아 nullptr처럼 멋지지만 지원됩니다. 고정 생성자 :

Node(string name_, Node* next_=0): name(name_), next(next_) {} 
0

사실 고정 된 길이의 루프 작동하지만 NULL 루프 나던 일 가능성이 마지막 노드의 다음 필드에 잘못된 주소가 그 것을 보여준다 종료되었습니다.

당신의 문제는 Node 생성자 나 목록 코드 또는 이들 사이의 상호 작용에서 비롯됩니다.

노드 생성자에서 0/nullptr 옆에 설정을 설정하면 도움이 될 것입니다.

또는 목록에 첫 번째 요소를 추가 할 때 다음 필드를 0으로 설정하거나 목록의 끝에 요소를 추가하십시오.

+0

감사합니다. – br1992

관련 문제