2012-07-14 2 views
1

구조체를 연결된 순서대로 숫자를 삽입하는 데 문제가 있습니다. 각 구조체에는 아래 코드에 표시된 "숫자"가 있습니다. 가장 낮은 숫자 구조체를 목록의 머리 수 (즉 : "사람"에 의해 가리키는 구조체 수) 노력하고 있어요. 나는 하루 종일이 코드를 쳐다 보았고, 무엇이 잘못되었는지를 알 수 없다. 어떤 도움이라도 대단히 감사합니다. 감사합니다연결된 목록에 구조체를 추가하는 재귀 C++

Person *addPerson(Person *people, Person *addition, int &numList) 
{ 
if (people == NULL && numList == 0) 
{ 
    people = addition; 
    numList++; 
    return people; 
} 
if (people->number >= addition->number) 
{ 
    addition->nextPerson = people; 
    people = addition; 
    return people; 
} 
else if (people->number < addition->number && people->nextPerson != NULL) 
{ 
    addPerson(people->nextPerson, addition, numList); 
} 
else if (people->number < addition->number && people->nextPerson == NULL) 
{ 
    people->nextPerson = addition; 
    numList++; 
    return people; 
} 
} 

편집 **

int main() 
{ 
Person *blake = new Person; 
Person *kyra = new Person; 
Person *elon = new Person; 
Person *bill = new Person; 
Person *people = NULL; 

blake->number = 1; 
blake->name = "blake"; 
blake->lastName = "madden"; 
blake->nextPerson = NULL; 

kyra->number = 2; 
kyra->name = "kyra"; 
kyra->lastName = "madden"; 
kyra->nextPerson = NULL; 

elon->number = 3; 
elon->name = "elon"; 
elon->lastName = "musk"; 
elon->nextPerson = NULL; 

bill->number = 4; 
bill->name = "bill"; 
bill->lastName = "gates"; 
bill->nextPerson = NULL; 

int num = 0; 
int &numList = num; 

people = addPerson(people, blake, numList); 

people = addPerson(people, kyra, numList); 
people = addPerson(people, elon, numList); 
people = addPerson(people, bill, numList); 

cout << people->name << '\n' << people->lastName; 
} 

답변

2

당신은 세 번째 if 블록에 addPerson()의 반환 값을 사용하고 있지 않습니다. 시도 :

people->nextPerson = addPerson(people->nextPerson, addition, numList); 
return people; 

을 또한 그렇지 않으면 당신은 현명한 아무것도 반환 함수의 끝을 실행하지거야 거기에 return people;이 필요합니다 (내 컴파일러는 당신이 너무 않도록, 당신이 당신의 경고 설정을 변경해야합니다 그것에 대해 나에게 경고).

위와 같이 변경하면 코드가 올바르게 실행 된 것처럼 보입니다.

+0

아, 그거야. 그 해결책이 문제의 원인이 될까요? 꼭 목록의 머리 바로 뒤에 있지 않은 노드를 추가하고 싶다면? –

+0

또한 부차적 인 질문이지만 비교적 단순한 문제로 인해 더 어려운 개념이 더 어려워 질 것입니다. 이 문제를 훨씬 쉽게 해결할 수 있어야한다고 생각합니다. –

+0

저는 여러분이 방금 시작했을 때, 특히 재귀를 시작할 때 이와 같은 것을 간과하는 것이 일반적이라고 생각합니다. 처음에는 버그를 보지 못했고 코드를 실행하려고 할 때만 무슨 일이 일어나고 있는지 명확 해졌습니다. 모든 경우에 이것이 작동하는지에 대한 귀하의 불확실성에 관해서는, 귀하의 연결된 목록 삽입기를위한 단위 테스트를 작성하는 것이 좋습니다. :) –

0

문제는 함수에 대한 인수입니다. 재귀 호출 순서에서 이전 호출자의 노드에서 포인터를 수정하려고하지만 단순히 다음 노드의 포인터 값을 전달할뿐입니다. 그렇다고해서 이전 노드의 포인터 멤버를 실제로 수정할 수는 없습니다. 세 번째 블록에 addPerson를 호출 할 때

void addPerson(Person** people, Person *addition, int &numList) 

그런 다음,과 같이 그것을 :

addPerson(&(*(people)->nextPerson), addition, numList); 

그리고 마지막으로 당신이 people 액세스 할 때 다음과 같이 보이도록

당신의 기능을 변경

인수를 사용하려면 다음과 같이 추가 참조를해야합니다.

*people = addition; 

또는

if ((*people)->number >= addition->number) 
+0

반환 값을 지정하는 또 다른 가능한 접근 방식입니다. – Antimony

+0

그건 분명히 사실입니다 ... 여전히 문제는 그가 이전 호출에서 노드의 포인터 값을 수정하지 않는다는 것입니다 ... – Jason

1

반환 된 머리를 할당하지 않았습니다. 그것은이어야한다

people->nextPerson = addPerson(people->nextPerson, addition, numList); 
+0

이것은 문제를 해결하지 못했습니다 –

+0

@BlakeMadden : 아마도 문제가 실제로 무엇인지 우리에게 말할 수 있습니다 . 현재, 우리는 코드를보고 추측하고 있습니다. –

+0

코드를 실행할 때 목록의 머리 부분은 목록의 3 번째 항목이어야합니다. 내 주()를 제공합니다 : –

관련 문제