2012-03-11 62 views
0

你好我的代码问题是在我的第二个else循环;我从不输入它,因此我从不为我的列表创建新的节点。谁能帮我看看我错过了什么?为什么我的插入函数不能为列表创建新节点?

bool List::Insert(int data) 
{ 
    Node* P = new Node; 
    if(P==NULL) 
    { 
     return false; 
    } 
    else 
    { 
     P ->info = data; 
     P ->next = NULL; 
      if(Head == NULL) 
      { 
       Head = P; 
      } 
      else 
      { 
       Node* lastNode; 
       for(lastNode = Head; lastNode ->next != NULL; lastNode = lastNode ->next) 
       { 
        lastNode ->next = P; 
       } 
      } 
     return true; 
    } 
} 
+0

其他不是一个循环。我在这里只看到一个循环。 “我的第二个循环”是什么意思? – abelenky 2012-03-11 02:34:50

+0

@abelenky,“2nd else loop”将是“2nd else内部的循环”:-)换句话说,就像你说的那样,唯一的循环。你可以把它看作是“2nd(else loop)”(错误,因为只有一个,没有这样的野兽)或“(2nd else)循环”(在这种情况下是右边的)。 – paxdiablo 2012-03-11 02:37:36

回答

3

此:

Node* lastNode; 
for(lastNode = Head; lastNode ->next != NULL; lastNode = lastNode ->next) 
{ 
    lastNode ->next = P; 
} 

是完全错误的。它将更改next指针,为当前在列表中的每个单个节点指向您的新节点。你只需要改变指针在最后节点:

Node* lastNode = Head; 
while (lastNode->next != NULL) 
    lastNode = lastNode->next; 
lastNode->next = P; 

您也可以,为提高效率,要保持一个独立的Tail指针(除了你Head),这样就可以简单地更换整个操作与:

Tail->next = P; 
Tail = P; 

这样,你不必每次都想遍历整个列表追加一个新的节点。那么你的代码变得像(不穿越,并与更新尾指针以及):

// Prepare new node. 

Node *P = new Node; 
P->info = data; 
P->next = NULL; 

// If list empty, set head and tail to new node, otherwise 
// append it. 

if (Head == NULL) { 
    Head = P; 
    Tail = P; 
} else { 
    Tail->next = P; 
    Tail = P; 
} 

我会突然停止批评的事实,你Insert方法实际上插入而是追加。我近乎肛门保持性的挑剔性质不太可能让我对你感兴趣:-)

+0

太棒了!但我应该如何初始化lastNode B/C我得到一个运行时错误B/C其未初始化。 – Jake 2012-03-11 02:34:39

+0

Opps,抱歉@Jake,没有从'for'循环中结束。我修改了代码以正确初始化'lastNode'。 – paxdiablo 2012-03-11 02:36:38

+0

美丽!谢谢!!! – Jake 2012-03-11 02:37:11

1

lastNode - > next = P; //这必须后去

+0

它是后为? – Jake 2012-03-11 02:31:53

+0

离开身体后为身体放置这条线 – vfiskewl 2012-03-11 02:33:19

相关问题