2015-01-09 91 views
0

我將文本文件中的信息添加到節點中,然後創建一個鏈接列表,然後將其打印出來,但出現問題。我打印這些節點,結果非常完美,但是當我將它添加到列表中並打印出列表時,我得到了不斷的重複,並且需要大約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; 
    } 
} 
+0

請查詢可以回答的問題。 – 2015-01-09 19:39:48

回答

1

你每次打印出整個列表,你的元素添加進去。所以你實際上正在打印#elements階乘線。將ustomerlist.print()移動到休息之前。

編輯 - 正如其他海報指出的那樣,打印問題遠離代碼最重要的問題,但上述更改應該修復它。

+0

謝謝你多謝! :) – 2015-01-09 19:57:27

1

好吧,讓我們列出一些眼前的問題:

在您分配內存並將其分配給padd功能,那麼你就直接重新分配p以指向ustomer指向,使你失去你的記憶分配。

main函數中,你不應該做while(!in.eof()),因爲eofbit標誌沒有設置,除非你試圖從文件之外讀取,否則你將迭代一次到多次。相反,例如

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

然後你把所有的最嚴重的問題:Undefined behavior,因爲你有指針ustomer但你永遠不初始化指針,你永遠不會使它指向任何地方。

最後一個問題的解決方案也可以解決第一個問題(內存泄漏):不要在add函數中分配陽極,而是在循環中分配一個節點,並在add函數中使用它。

0

您提到打印功能在「繼續」之前「重複」了信息。這是爲什麼:

當您添加更多的節點時,所有先前的節點將被打印出來,所以當您添加第N個節點時,您將打印(N^2)/ 2個項目,第M個節點重複NM次(它是二次方而不是階乘)。所以你的時候有五個客戶說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; 
     } 
    } 
}