2016-11-10 18 views
1

私はデータバッグ構造を作成しました。私はファイルのテキストを読み、各単語をノードに挿入し、同じ文字列があればカウントをインクリメントします。しかし、私の問題は、同じ文字列のうちの1つの文字列とそれが使用された回数だけを出力したいということです。しかし、私がremove関数を使用するときはいつでも、ファイル内のすべてを削除します。もし私がそれを使用しなければ、私は以下の出力を得ます。私は間違って何をしているのかわかりません、重複した文字列を出力しない方法はありますか?特定のノードの削除

ofstream output; 
struct BagNode 
{ 
    string dataValue; 
    string dataCopy; 
    int dataCountCopy; 
    int dataCount; 
    BagNode * next; 
}; 
class Bag{ 
private: 

BagNode * head; 

public: 

Bag() 
{ 
    head = NULL; 

} 
void insert(string v) 
{ 
    if(head == NULL){ //empty list 
     head = new BagNode; 
     removePunct(v); 
     head->dataValue = v; 
     transform(v.begin(), v.end(), v.begin(), ::tolower); 
     head->dataCopy = v; 
     head->next = NULL; 

    } 
    else 
    { 
      BagNode * n = new BagNode;  // new node 
      removePunct(v); 
      n->dataValue = v; 
      transform(v.begin(), v.end(), v.begin(), ::tolower); 
      n->dataCopy = v; 
      BagNode * current = head;   //for traversal 
      //current = head; 
      n->dataCount = 0; 
       if(current->dataCopy > v) 
       {      
        n->next = head; 
        head = n; 
       } 
       else{   //mid and tail insert 
        while(current->next && current->next->dataCopy < v) 
        { 
         current = current->next; 
        } 
        n->next = current->next; 
        current->next = n; 

       } 

    } 
    BagNode * check = new BagNode; 
    for(check = head; check->next != NULL; check = check->next) 
    { 
     if(check->dataCopy == v)//isSame(check->dataValue, v)) 
     { 
      check->dataCount++; 
     } 

    } 

} 
bool remove(string v) //bool 
{ 
    bool status; 
    if(head == NULL){ 
     status = false; 
    } 
    else if(head->dataCopy > v) 
    {//(head->dataValue > v){ 
     status = false; 
    } 
    else if(head->dataCopy == v) 
    { 
     BagNode * t = head; 
     head = head->next; 
     delete t; 
     status = true; 
    } 
    else//general case 
    { 
     BagNode * current = head; 
     while(current->next && current->next->dataCopy < v){ 
      current = current->next; 
     } 
     if(current->next == NULL) 
     { 
      status = false; 
     } 
     else if(current->next->dataCopy == v) //found it 
     { 
      BagNode *t = current->next; 
      current->next = current->next->next; 
      delete t; 
      status = true; 
     } 
     else 
     { 
      status = false; 
     } 
    } 
    return status; 
} 
void traverse() 
{ 
    BagNode * current; 

    current = head; 
    while(current) 
    { 
      output << current->dataValue << " (" << current->dataCount << ")" << " "; 
      current = current->next; 

    } 
    cout << endl; 
} 

出力:10Annette(1)1805(1)7(1)(1)(2)(3)(4)(5)(6)全て(1 )全て(2)(1)及び(1)及び(2)及び(3)及び(4)及び(5)及び(6)、(10)及び(7)

if(!inputFile) 
    { 
     cout << "Could Not Open " << fileName << " File" << endl; 
     exit(EXIT_FAILURE); 
    } 
    else 
    { 
     while(inputFile >> text) 
     { 
      theBag.insert(text); 

     } 
     cout << "Processing File Complete" << endl; 
     cout << "Please Enter An Output File Name: "; 
     getline(cin,outputFilename); 
     output.open(outputFilename); 
     theBag.traverse(); 
     theBag.remove(text); 
     inputFile.close(); 
     output.close(); 
    } 
+0

@RawN Ok、その上にあります。ありがとう – Thompson

+1

あなたのインストラクターの邪魔になるかもしれない愚かな単純な方法は 'std :: map strings;'これで 'strings [stringIJustParsed] ++;'と事実上全て作業の完了です。マップは 'stringIJustParsed'の新しい' int'を作成し、 'stringIJustParsed'が既に分かっている場合はゼロを初期化するか、既存の' int'を取得します。新規または古い 'int'、' int'がインクリメントされ、カウンタが提供されます。 – user4581301

+0

@ user4581301私のdataCountのために、私は本当にそれを必要としませんか? – Thompson

答えて

1

挿入関数でここを見ると、実際にはその値を持つすべてのノードに触れています。したがって、v = "And"の場合、すべての単一の "And"ワードがデータカウントをインクリメントしています。これにより、すべてのノードで正しい単語数を取得できます。

for(check = head; check->next != NULL; check = check->next) 
{ 
    if(check->dataCopy == v)//isSame(check->dataValue, v)) 
    { 
     check->dataCount++; 
    } 
} 

あなたは、その動作を利用することであなたの挿入をもっと簡単にすることができるようです。

+0

あなたが言っていることは、「繰り返しを持たない最良の方法は重複を追加しないことです」 OPの挿入ロジックの一部が欠落しています。 – user4581301

+0

ええ、私の答えは、宿題の解決策を意図的に修正していないことです。 Thompsonはすでに、彼らのプログラムがそれがどういうふうに動作しているのかをデバッグすることに少しだけ取り組んでいることを理解しています。どちらがイライラする可能性があり、デバッグ時にクラスを思い出さない;-) – snowballhg

関連する問題