2015-09-27 24 views
-1

我一直在尝试创建一个有序的双链表,然后用递归将它向前和向后打印出来。我不知道是否将节点错误地添加到链接列表中,或者如果我的问题出现在我的打印功能中。试图用C++递归地打印链表

主要

int main() { 
    ifstream addData; 
    addData.open("proj1adds.data"); 
    LinkedList<int> List; 
    Node<int> *head = NULL: 
    int add; 
    int i = 0; 
    while (!addData.eof()){ 
     addData >> add; 
     List.add(i, add); 
     i++; 
    } 
} 

这是我的附加功能

template < typename T > 
void LinkedList <T>::add(int index, T element) 
{ 
    if (index == 0){ 
    addFirst(element); 
    } 
    else if (index >= size){ 
    addLast(element); 
    } 
    else 
    { 
    Node <T> * current = head; 
    for (int i = 1; i < index; i++) 
     current = current->next; 
    Node <T> * temp = current->next; 
    current->next = new Node <T> (element); 
    (current->next)->prev = current; 
    (current->next)->next = temp; 
    size++; 
    } 
}  

这些都是我的打印功能

template<typename T> 
void LinkedList<T>::printForward(Node<T> *head){ 
    if(head==NULL){ 
     return; 
    } 
    cout << head->element << endl; 
    printForward(head->next); 
} 

template<typename T> 
void LinkedList<T>::printBackward(Node<T> *head){ 
    if(head==NULL){ 
     return; 
    } 
    printBackward(head->next); 
    cout << head->element << endl; 
} 

我认为我已经加载数据到节点,但我不确定它的订购是否因为我无法打印。

+0

至少打印后退看起来好像它的方向不对。如果没有程序的缺失部分,我们无法编译或测试你的代码,但是:你得到了什么输出?尝试在调试器中单步执行程序并检查头,*(head-> next)等。测试您的流是否成功读取任何内容。这至少会告诉你,如果你的数据被存储。 – Davislor

+0

而不是试图从文件读取数据,硬编码一些值。然后尝试在尝试递归之前打印*一个节点*的内容。从小而简单的开始,一次添加一点复杂性,并且**不要添加到不起作用的代码**。 – Beta

+0

数据正在被存储,我通过添加功能行并进行了检查。当我在main中调用printFowards(head)或printBackwards(head)时,它会返回if语句中的返回值,然后运行失败。我评论了退出条件,看看会发生什么(我预计它会进入一个无限循环),但运行失败,只要它到达了cout << head->元素<< endl; –

回答

0

在评论(但不是在你的问题)你说你打电话printFowards(head)printBackwards(head)main()。但在main()中,变量head是设置为NULL的局部变量。所以函数中止,并且当你注销退出条件[不寒而栗]时,你解除引用空指针并获得未定义的行为。

也许列表被正确构建;这并不重要,因为您对打印功能的呼叫没有连接到列表。