2013-04-06 118 views
0

我想要一個插入函數,它調用一個專用的遞歸插入函數,將下一個數字添加到鏈表的末尾。我遇到了麻煩,我應該使用哪些參數,以及遞歸插入函數中應該包含哪些參數。我在想,遞歸插入函數需要一個Node指針遞歸地遞進。追加與遞歸鏈接列表

class LinkedList{ 
    private: 
     struct Node{ 
      int data; //stores data in nodes 
      Node* next; 
      ~Node(){delete next;} 
     }; 
    public: 
    LinkedList(){ first = NULL;} 
    ~LinkedList(){delete first;} 

    void print() const { 
     print(first); 
    } 
    void insert(const int d){ //here is where the first insert method is 
    insert(first, d); 
    } 
private: 
    Node* first; 

這裏是我想知道如何得到插入功能通過獲取參數的不同過載,我被困在功能...

void insert(Node* p, const int d){ //this is the private recursive one 
     Node* temp = new Node; 
     temp->data=d; 
     if(p->next == NULL) p->next = temp; 
     else insert(p->next, d); 
     } 

}; 

int main() { 
int a[] = { 1, 2, 3, 4, 5, 6}; 
LinkedList list; 
    for(int i=0; i<6; i++) 
    list.insert(a[i]); 
} 

。我也想知道我是否正確地逐步完成遞歸函數。

回答

2

調用遞歸函數應該像

void insert(const int d){ 
     insert(first, d); 
    } 

該函數的遞歸函數應該像

void insert(Node*& p, const int d){ 
    Node* temp = new Node; 
    temp->data=d; 
    if(p == NULL) p = temp; 
    else insert(p->next, d); 
} 
0

您希望在分配新節點之前到達列表的末尾。以下版本與您迄今爲止所寫的內容最爲兼容。

void insert(Node*& p, const int d) { 
    if (p == NULL) { // reached the end, so allocate new node and set value 
     p = new Node; 
     p->data = d; 
     p->next = NULL; 
    } 
    else 
     insert(p->next, d); 
}