从链表中顺利打印节点

时间:2015-01-09 19:36:09

标签: c++ visual-c++ visual-studio-2012 linked-list nodes

我将文本文件中的信息添加到节点中,然后创建链接列表,然后打印出来,但我遇到了问题。我打印节点并且它完美无缺,但是当我将它添加到列表并打印出列表时,我会不断重复,并且需要大约6个小时才能通过列表,最多需要20秒,它最终会在列表中的信息中移动,但在移动之前重复一些信息大约500次,同时重复所有先前的信息相同的次数。这是我的addprint功能:

void customerlist::add(customer* ustomer)
{
    customer* p = new customer;
    p = ustomer;
    p->next = NULL;
    if (head != 0)
    {
        curr = head;
        while (curr->next != NULL)
        {
            curr = curr->next;
        }
        curr->next = p;
        n++;
    }
    else
    {
        head = p;
    }
}

int customerlist::getLength()
{
    return n;
}

void customerlist::print()
{
    curr = head;
    while (curr != NULL)
    {
        cout << curr->ID << " ";
        cout << curr->name << "  " << curr->lastname << "  " << curr->town << endl;
        curr = curr->next;
    }
}

我的主要人物:

while (!in.eof())
{
    account* bank = new account;
    customer* ustomer; in >> ustomer->ID;
    // display number of customers
    if (ustomer->ID < 90000000)
    {
        count++;
        in >> ustomer->name >> ustomer->lastname >> ustomer->town;
        // cout << ustomer->ID<< " " << ustomer->name << "  " << ustomer->lastname<< "        "         << ustomer->town << endl ;
        ustomerlist.add(ustomer);
        ustomerlist.print();
    }
    else
    {
        break;
    }
}

3 个答案:

答案 0 :(得分:1)

每次向其中添加元素时,您都会打印出整个列表。所以你实际上是在打印#elements factorial lines。将ustomerlist.print()移动到休息之前。

编辑 - 正如其他海报所指出的那样,打印问题远非代码中最重要的问题,但上述更改应该解决它。

答案 1 :(得分:1)

好的,让我们列出一些直接的问题:

add函数中,您可以分配内存并将其分配给p,然后直接重新分配p以指向ustomer所指向的位置,从而使您失去内存你分配。

main函数中,您不应该while(!in.eof()),因为在您尝试从文件之外读取之前,eofbit标志不会被设置,您将迭代一次到多次。相反,例如,

while (in >> name >> lastname >> town) { ... }

然后你遇到了最严重的问题:Undefined behavior,因为你有指针ustomer,但你永远不会初始化那个指针,你永远不会把它指向任何地方。

最后一个问题的解决方案也可以解决第一个问题(内存泄漏):不是在add函数中分配阳极,而是在循环中分配一个节点,然后在添加中使用它功能

答案 2 :(得分:0)

你提到打印功能&#34;重复&#34;之前的信息&#34;继续前进&#34;。原因如下:

当您添加更多节点时,将打印出所有先前的节点,因此当您添加第N个节点时,您将打印(N ^ 2)/ 2个项目,其中第M个节点重复NM次(它的二次而不是 factorial )。所以当你有五个顾客说A B C D E时,你会看到:

A 
A B 
A B C 
A B C D 
A B C D E 

相反,每次添加新节点时,都要打印该新节点而不是整个列表。

在你的主要考虑这个逻辑:

main(){
    count = 0;
    tail = head;
    while (!in.eof())
    {
        customer *new_customer;
        in >>  new_customer->ID;
        //check ID against defined MAX instead of a hard coded #
        if(new_customer->ID < MAX_ID) {
            count ++;
            in >> new_customer->name >> new_customer->lastname >> new_customer->town;

            tail->next = new_customer;
            tail = tail->next;
            tail->next = NULL;
            // here, print each new node using cout, so you will have the complete list as you add
            cout << new_customer->name << " " << blah blah << endl;

            // unless there's a specific need to print the entire list every time, use:  
            // customerlist.print(); 
        }
        else {
            break;
        }
    }
}