2013-08-17 59 views
0

以下是我嘗試在鏈表的通用表示形式,其中我通過整數示例。我知道問題在於我如何分配下一個(通過add_to_list函數),但在盯着屏幕2個小時後,我仍然不知道什麼是錯誤的。有人能指導我完成它嗎?C++:調試通用鏈接列表所需的幫助

#include<iostream> 
using namespace std; 

/** Class Definition here */ 

template<typename T> 
class Linklist 
{ 
    struct node 
    { 
     node(T value,node* next=NULL):value(value),next(next) {} 
     node* next; 
     T value; 
    }; 
    node* head; 
    node* curr; 

public: 
    Linklist(node* n=0):head(n) {} 
    ~Linklist(); 
    void add_to_list(T value, bool x=1); 
    void print(); 

}; 

/** Class destructor */ 
template<typename T> 
Linklist<T>::~Linklist() 
{ 
    node *ptr ; 
    while(head!=NULL) 
    { 
     ptr=head; 
     head=head->next; 
     delete ptr; 
    } 
} 


template <typename T > 
void Linklist<T>::add_to_list(T x, bool z) 
// bool basically means if to add the element to beginning or end of list, 1 for end. 
{ 
    node* k=new node(x); 
    if(head==NULL) 
    { 
     k->value=x; 
     k->next=NULL; 
     head=curr=k; 
    } 
    else 
    { 
     k->value=x; 
     k->next=NULL; 
     if (z==1) 
     { 
      curr->next=k; 
      curr=k; 
     } 
     else 
     { 
      k->next=head; 
      head=k; 
     } 
    } 
    delete(k); 

} 

template<typename T> 
void Linklist<T>::print() 
{ 
    node* ptr= new node(1); 
    ptr=head; 
    if (ptr==NULL) 
    { 
     return ; 
    } 
    else 
    { 
     cout<<"reached here \n " <<"pointer is"<<ptr->value<<"\n next is"<<ptr->next; 
     while(ptr!=NULL) 
     { 
      cout<<ptr->value<<"-->"; 
      ptr=ptr->next; 
     } 
    } 
} 


int main() 
{ 
    Linklist<int> *intlist=new Linklist<int>(); 
    intlist->add_to_list(20,0); 
    intlist->add_to_list(344,1); 
    intlist->print(); 
    return 0; 
} 
+0

您看到了什麼輸出? – andy256

+0

你錯過了實際的問題。 – chris

+0

@ andy256,只是第一個元素(即1 - >) 我一步一步檢查分析,下一個函數每次返回0,但不能看到爲什麼。 –

回答

4

delete(k);你將它添加到列表中後,使系統可以使用新對象的內存。 因爲你仍在使用內存

你不應該刪除它。當你不刪除它的輸出是:

reached here 
pointer is20 
next is0020882020-->344--> 

不相關的錯誤,但是你應該避免new時,你可以,例如您的main代碼:

Linklist<int> intlist; 
intlist.add_to_list(20,0); 
intlist.add_to_list(344,1); 
intlist.print(); 
+0

超級Facepalm! 嗯謝謝:) –

+1

你是正確的,刪除​​它後調用'delete'它的問題,但編譯器不會「把垃圾」在節點中。它只是使內存可用於其他事情。 – Blastfurnace

+0

好的。所以我基本上會調用deconstuctor來釋放內存。在如此短暫的時間裏學會了如此多的概念,所以它對大腦有點負擔:) –