2014-10-27 162 views
0

我試圖插入的對象(鳥),它保存的名稱和ID號 我有問題插入對象到我的鏈表鏈表插入問題

bool List342::Insert(Bird *obj) 
{ 
    Node *insNode = new Node; 
    insNode->data = obj; 

    if (head == NULL) 
    { 
     head = insNode; 
     return true; 
    } 

    //cout << head->data->getID(); 
    if ((insNode->data->getID()) <= (head->data->getID())) 
    { 
     insNode->next = head; 
     head = insNode; 
     return true; 
    } 

    Node *pNode = head; 
    while ((pNode->next != NULL) && ((pNode->next)->data->getID() <= insNode->data->getID())) 
    { 
     pNode = pNode->next; 
    } 
    insNode->next = pNode->next; 
    pNode->next = insNode; 
    return true; 
} 

它不似乎正確地插入 我試圖把一個COUT代碼,看看什麼數字被比較 例如 COUT < <頭戴式>數據 - >的getID() ,它似乎輸出電流鳥的電流id 而不是頭部的ID(應該是最低的ID)

拜託,謝謝!

+0

1)你確定'next'被初始化爲NULL嗎?如果不是,你應該做'insNode-> next = head;'或'insNode-> next = NULL;'當插入一個空列表時。 2)邏輯看起來有點不一致:當新項目與第一個項目相等時,將其插入列表的前面,但是當它與其他一些數據相同時,可以跳過它們並插入組的末尾。 – CiaPan 2014-10-27 07:46:15

+0

你的函數總是返回true,對我來說這是一個問題。 – sop 2014-10-27 08:01:43

回答

2

我看不到函數返回的位置false。所以我認爲將函數聲明爲返回類型bool沒有任何意義,因爲它總是返回true

我已經宣佈functtion具有返回類型void雖然你可以聲明功能像以前那樣有返回類型bool但在這種情況下,你需要添加最後一條語句,將返回true。 也許最好是聲明函數返回列表本身的引用。

功能可以定義下面的方式

void List342::Insert(Bird *bird) 
{ 
    Node *prev = NULL; 
    Node *current = head; 

    while (current != NULL && !(bird->getID() < current->data->getID())) 
    { 
     prev = current; 
     current = current->next; 
    } 

    Node *newnode = new Node { bird, current }; 

    if (prev != NULL) prev->next = newnode; 
    else head = newnode; 
} 

我想,節點有如下定義

struct Node 
{ 
    Bird *data; 
    Node *next; 
}; 

您可以替代聲明

Node *newnode = new Node { bird, current }; 

Node *newnode = new Node; 
newnode->data = bird; 
newnode->next = current; 
1

該功能對我來說工作正常。 我希望頭部在插入功能之外改變。 你應該檢查插入的調用部分或其他修改頭部值的地方嗎?