1

I'm having trouble inserting a struct into a linked list in numerical order. Each struct has a "number" as indicated in the code below. I'm trying to have the struct with the lowest number be the head of the list (ie: be the struct pointed to by "people"). I've been staring at this code on and off all day and I can't figure out what's wrong with it. Any help is much appreciated. Thanks

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;
}
}

EDIT**

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;
}
4

3 に答える 3

2

addPerson()3 番目のifブロックの戻り値を使用していません。試す:

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

そこにも必要return people;です。そうしないと、関数の最後で実行され、適切なものが返されません (私のコンパイラはそれについて警告しました。警告設定を変更する必要があります)。

上記の変更により、コードが正しく実行されているように見えます。

于 2012-07-14T01:33:09.163 に答える
1

返された頭を割り当てることはありません。そのはず

people->nextPerson = addPerson(people->nextPerson, addition, numList);
于 2012-07-14T01:35:26.400 に答える
0

あなたの問題は、関数への引数です。再帰呼び出し順序で前の呼び出し元のノードのポインターを変更したいのですが、単に次のノードのポインター値を渡しているだけです。これでは、前のノードのポインター メンバーを実際に変更することはできません。

関数を次のように変更します。

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

addPerson次に、3 番目のブロックを呼び出すときは、次のようにします。

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

最後に、引数にアクセスするときpeopleは、追加の逆参照を必ず実行してください。たとえば、次のようになります。

*people = addition;

また

if ((*people)->number >= addition->number)
于 2012-07-14T01:33:21.273 に答える