2013-10-05 155 views
3

我真的很困惑,究竟是怎麼回事的前..添加節點到鏈表

我具備的功能

void addToFront(int data) 
{ 
    Node* tmp = new Node(); 
    tmp -> data = data; 
    tmp -> next = head; 
    head = tmp; 
} 

所以,當我們做線tmp-> next = head,我們正在將tmp指針指向head指向的內容(列表的當前第一個元素)?因爲這就是它的感覺,但不會只是讓它指向head?然後當我們做head = tmp時,我們正在向我們創建的新節點指出正確的方向?

回答

1

因此,當我們執行tmp-> next = head行時,我們使tmp指針指向頭指向的內容(列表的當前第一個元素)?因爲這就是它的感覺,

正確。

但是這不會讓它指向頭嗎?

否。要指向開頭,需要包含地址的頭部。但是這條線使得它包含頭部的。所以不行。

然後當我們做head = tmp的時候,我們正在把頭指向我們創建的新節點,對嗎?

是的。

+0

@so然後,因爲指針的值是它指向的東西的地址,所以tmp得到頭的價值意味着它得到了什麼頭指向的地址.. – FrostyStraw

+0

這是正確的。 'tmp - > next = head;'給出'tmp - > next'和'head'相同的值。因此'tmp - > next'現在指向'head'指向的任何東西。 –

+0

但後來不會頭= tmp意味着頭現在指向任何tmp指向?現在不是tmp指向以前是鏈表上的第一個節點嗎? – FrostyStraw

11

這是怎麼了你的清單(假設)

+----+-----+ +-----+-----+ +-----+------+ 
| A |  +-->|  |  +-->|  |  | 
+----+-----+ +-----+-----+ +-----+------+ 
/

Head指向位置A

你讓一個新的節點

+----+----+ 
| B | | 
+----+----+ 
/

tmp現在指向B。您在tmp->data中插入數據,然後再製作tmp -> next = head;。所以現在我們有:

+----+----+  +----+-----+ +-----+-----+ +-----+------+ 
| B |next|---->| A |  +-->|  |  +-->|  |  | 
+----+----+  +----+-----+ +-----+-----+ +-----+------+ 
       /

然後你做head指向B而不是A

+----+----+  +----+-----+ +-----+-----+ +-----+------+ 
| B |next|---->| A |  +-->|  |  +-->|  |  | 
+----+----+  +----+-----+ +-----+-----+ +-----+------+ 
/\ 

head & tmpB現在。

+1

這裏是一個完整的實現http://stackoverflow.com/questions/19148576/memory-leak-in-removehead-function/19150590#19150590 – ChuckCottrill

0
#include<iostream> 
using namespace std; 
struct Node 
{ 
    int data; 
    Node *link; 
}; 
class LinkList 
{ 
    Node *headptr; 
public: 
    LinkList() 
    { 
     headptr=NULL; 
    } 

    void InsertatFirst(int val) 
    { 
     Node *newNode; 
     newNode = new Node; 
     newNode ->link =NULL; 
     newNode ->data = val; 
     newNode ->link=headptr; 
     headptr = newNode; 
    } 

    void Display() 
    { 
     Node *disNode; 
     disNode = headptr; 
     while(disNode !=NULL) 
     { 
      cout<<"Display Node Value is "<<disNode ->data<<endl<<endl; 
      disNode = disNode->link; 
     } 
    } 

}; 
void main() 
{ 
    LinkList lobj; 
    lobj.InsertatFirst(45); 
    lobj.InsertatFirst(2); 
    lobj.InsertatFirst(1); 
    lobj.InsertatFirst(0); 
    lobj.InsertatFirst(-1); 
    lobj.Display(); 
} 
+1

雖然這段代碼可能回答這個問題,但最好包含一些上下文,解釋它如何工作以及何時使用它。從長遠來看,僅有代碼的答案是沒有用的。 – Bono

0
void addToFront(int data) { 
    Node* tmp = new Node(t); //assume your Node constructor can handle this 
    if(numElements != 0) { //should check weather empty or not 
    x->next = head;  //link them first 
    head = x;    //and now make the head point to the new head 
    } else {  //if empty you should also set the tail pointer 
    head = x; 
    tail = x; 
    } 
    numElements++; 
} 

如果有一個頭,新節點「下一個」將是點到指向另一個節點當前的頭。然後head = x,頭指針現在被設置爲指向新節點而不是前一個指針