2016-11-07 2 views
0

バッグデータ構造を作成しましたが、文字列の同じインスタンスが挿入されるたびにカウンタをインクリメントしようとしていますが、何らかの理由でカウンタがインクリメントされません。入力された同じ文字列の提案?バッグデータ構造のインクリメントカウンタ

struct BagNode 
{ 
    string dataValue; 
    int dataCount; 
    BagNode * next; 
}; 
class Bag{ 

private: 
BagNode * head; 

public: 
Bag() 
{ 
    head = NULL; 
    //curr = NULL; 
} 
void insert(string v) 
{ 
    if(head == NULL){ //empty list 
     head = new BagNode; 
     head->dataValue = v; 
     head->next = NULL; 

    } 
    else 
    { 
      BagNode * n = new BagNode;  // new node 
      n->dataValue = v; 
      n->dataCount = 0; 
      BagNode * current = head;   //for traversal 
      //current = head; 
      if(isSame(current->dataValue,v)) 
      { 
       n->dataCount+= 1; 
      } 
      else 
      { 
       if(!isBefore(current->dataValue, v))  //new head 
       { 
        n->next = head; 
        head = n; 
       } 
       else{   //mid and tail insert 
        while(current->next && isBefore(current->next->dataValue,v)) 
        { 
         current = current->next; 
        } 
        n->next = current->next; 
        current->next = n; 
       } 
      } 
    } 
} 
bool isSame(string a, string b) 
{ 
    transform(a.begin(), a.end(), a.begin(), ::tolower); 
    transform(b.begin(), b.end(), b.begin(), ::tolower); 

    if(a == b) { 
     return true; 
    } 
    else { 
     return false; 
    } 
} 
void traverse() 
{ 
    BagNode * current; 
    current = head; 
    while(current) 
    { 
     output << current->dataValue << " (" << current->dataCount << ")" << " "; 
     current = current->next; 
    } 
    cout << endl; 
} 
+1

ここでは、デバッガを使用して一度に1行ずつコードをステップ実行したときに、どのような観察をしましたか?見つけたいバグと、メモリリークを引き起こすバグの2つがあります。 –

+0

このような問題を解決する適切なツールは、デバッガです。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低限、問題を再現する[最小、完全、および検証可能](http://stackoverflow.com/help/mcve)の例と、その問題を再現するためのデバッガ。 –

+0

@SamVarshavchik私はあなたにメモリリークがどこにあるのか尋ねるかもしれません – FastKid12

答えて

0

あなたは、あなたのリストの最初の要素にインクリメントするかどうかをチェックしていると、そうでないあなたは自分の新しいノードを挿入する場所を把握することを歩きます。 あなたは、他のノードのどれかがあなたが探しているはずの値を含んでいたかどうか実際には決して確認しませんでした。。あなたはそれを修正する必要があります。

サムが上記に言及しても、まだメモリリークがあります。また、毎回再計算するのではなく、常に小文字の文字列を格納するほうがよいかもしれないと付け加えます。

+0

メモリリーク!私はそれを修正すべきところを尋ねるかもしれません – FastKid12

+0

あなたは常に 'BagNode'を作成します。しかし、あなたが手前にある既存の要素を見つけたらそれを決して削除しません。 –

+0

ああ、これをするときn> next = head? – FastKid12

関連する問題