2012-07-14 37 views
1

我無法按數字順序將結構插入鏈表中。每個結構都有一個「編號」,如下面的代碼所示。我試圖讓具有最低編號的結構成爲列表的頭部(即:是「people」指向的結構)。我一整天都在盯着這個代碼,我無法弄清楚它有什麼問題。任何幫助深表感謝。由於在鏈表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

哦,那有效。但是,如果我想添加一個不一定直接位於列表頭後面的節點,那麼該解決方案是否會導致問題? – 2012-07-14 02:04:52

+0

另外,有一個側面的問題,但確實有這樣的相對簡單的事情問題表明,我會遇到更難的概念更多的麻煩?我覺得我應該能夠更輕鬆地解決這個問題。 – 2012-07-14 02:06:24

+0

我認爲當你剛剛開始時忽略這樣的事情是完全正常的,特別是在遞歸方面。我一開始並沒有看到這個bug,只有當我嘗試運行你的代碼時,它纔會變得明顯。至於你是否在所有情況下都能正常工作的不確定性,我建議你爲你的鏈表插入器寫一個單元測試。 :) – 2012-07-14 02:08:00

0

你是問題是函數的參數。您希望以遞歸調用順序修改前一個調用方中的節點中的指針,但您只是傳遞下一個節點的指針值。這不允許您實際修改前一個節點的指針成員。

更改功能,所以它看起來是這樣的:

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

然後,當你在第三塊調用addPerson,做它像這樣:

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

最後,當你訪問people參數,請確保做一個額外的解除引用,例如:

*people = addition; 

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

指定返回值是另一種可能的方法。 – Antimony 2012-07-14 01:36:14

+0

這是毫無疑問的......問題是他沒有修改前面調用的節點中的指針值...... – Jason 2012-07-14 01:36:49

1

你永遠不會分配返回的頭部。它應該是

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

這並沒有解決問題 – 2012-07-14 01:44:07

+0

@BlakeMadden:也許你可以告訴我們問題實際上是什麼。目前,我們正在查看代碼和猜測。 – 2012-07-14 01:46:10

+0

當我運行代碼時,列表的頭部是應該在列表中的第三個條目。我會提供我的main(): – 2012-07-14 01:48:53