[問題]
ファイルやキーボードから入力された単語とその出現回数をノードに持ち,単語のアルファベット順に連
結された以下に示すような単方向連結リスト WordCountListl クラスを新たに作成します。このリストでは,リストにない単語が挿入されると,新たにノードが挿入される,それ以外は,出現回数を更新する
プログラムは以下のようになっています。
#include<iostream> #include<fstream> using namespace std; class WordCountList{ // 単語とその出現回数をノードにもち,アルファベット順につなげた連結リスト private: class Node{ public: string word; // 単語 int count; //出現回数 Node *next; Node(string s="", int ct=0, Node *np=NULL){word=s; count=ct; next=np;} ~Node(){cout<<word<<" has been deleted..."<<endl;} }; Node *head; //連結リストの先頭ポインタ int node_num; // 連結リストにあるノードの個数 void clear(); //ノードを全て削除 public: WordCountList(){ head=NULL; node_num=0; } ~WordCountList(){ clear(); }; int size() const{ return node_num; }; void insert(string w); // 単語を挿入. すでにあれば,出現回数をインクリメント void remove(string w); // 単語を削除. 1回減算,或は,ノード削除 void print() const; //単語と出現回数をアルファベット順に昇順表示 void printR() const; //単語と出現回数をアルファベット順とは反対に降順表示 }; void WordCountList::clear(){ Node *ptr = head, *tmp; while(ptr!=NULL){ tmp = ptr->next; delete ptr; ptr = tmp; } } void WordCountList::insert(string w){ Node *ptr = head; if (head==NULL || head->word > w){ head = new Node(w, head->count, head); head->count++; } else{ while(ptr->next != NULL){ if(ptr->next->word ==w){ ptr->next->count++; return; } if(ptr->next->word > w){ ptr->next = new Node(w, ptr->next->count, ptr->next); ptr->next->count++; return; } ptr = ptr->next; } ptr->next = new Node(w, ptr->next->count, ptr->next); } } void WordCountList::remove(string w){ if(head==NULL) return; else if(head->word==w){ Node *ps=head; head=head->next; delete ps; } else{ Node *pb=0; for(Node *ps=head;ps;ps=ps->next){ if(ps->word==w){ pb->next=ps->next; delete ps; return; } pb=ps; } cout<<w<<" cannot be found"<<endl; } } void WordCountList::print() const{ for(Node *p=head;p;p=p->next){ cout<<p->word<< "(" << p->count << ") "; } } void WordCountList::printR() const{ Node *ptr=head,*swap; while(ptr->next != NULL){ ptr = ptr->next; } Node *tmp=head; while(tmp!=ptr){ swap = tmp->next; if(ptr->next==NULL){ cout<<ptr->word<< "(" << ptr->count << ") "; ptr->next = tmp; tmp->next = NULL; } else{ cout<<ptr->word<< "(" << ptr->count << ") "; tmp->next = ptr->next; ptr->next = tmp; } tmp = swap; } } int main(){ int stop=0; // loop stop flag; int n, ct, num; char select; string input, w; WordCountList wlist; while( !stop && cout<<" Select I/R/S/P/p/C/W/T/t/Q-->" && cin>>select){ switch(select){ case 'I': case 'i': cin >> w; wlist.insert(w); break; case 'R': case 'r': cin >> w; wlist.remove(w); break; case 'S': case 's': cout<<"List length = "<<wlist.size()<<" nodes"<<endl; break; case 'p': wlist.print(); break; // ascending order case 'P': wlist.printR(); break; // descending order case 'Q': case 'q': stop=1; break; default: cerr <<"Command Error\n"; stop=1; } } return 0; }
[求める実行結果]
Select I/R/S/P/p/C/W/T/t/Q-->i cat
Select I/R/S/P/p/C/W/T/t/Q-->i dog
Select I/R/S/P/p/C/W/T/t/Q-->i horse
Select I/R/S/P/p/C/W/T/t/Q-->i zebra
Select I/R/S/P/p/C/W/T/t/Q-->i turtle
Select I/R/S/P/p/C/W/T/t/Q-->i cat
Select I/R/S/P/p/C/W/T/t/Q-->i ant
Select I/R/S/P/p/C/W/T/t/Q-->i dog
Select I/R/S/P/p/C/W/T/t/Q-->i horse
Select I/R/S/P/p/C/W/T/t/Q-->i cat
Select I/R/S/P/p/C/W/T/t/Q-->p
ant(1) cat(3) dog(2) horse(2) turtle(1) zebra(1)
Select I/R/S/P/p/C/W/T/t/Q-->P
zebra(1) turtle(1) horse(2) dog(2) cat(3) ant(1)
[現状の実行結果]
Select I/R/S/P/p/C/W/T/t/Q-->i cat
これで終了してしまいます。
このことからinsert関数が上手く機能していないのかと考えました。
したがって
こういった時の解決の仕方または正しいコードの考え方などを
指摘していただけるとありがたいです。
よろしくお願いいたします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/06 07:26
2020/07/07 07:32