teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2020/07/06 08:50

投稿

episteme
episteme

スコア16612

answer CHANGED
@@ -6,4 +6,74 @@
6
6
  head->count++;
7
7
  }
8
8
  ...
9
+ ```
10
+ [余計なお世話] list使ってre-writeしてみた:
11
+ ```C++
12
+ #include <iostream>
13
+ #include <fstream>
14
+ #include <string>
15
+ #include <list>
16
+ #include <utility>
17
+ #include <algorithm>
18
+
19
+ class WordCountList { // 単語とその出現回数をノードにもち,アルファベット順につなげた連結リスト
20
+ using Node = std::pair<std::string,int>;
21
+ std::list<Node> words;
22
+ static bool node_less(const Node& a, const Node& b) { return a.first < b.first; }
23
+ void clear() { words.clear(); } //ノードを全て削除
24
+
25
+ public:
26
+ WordCountList() { }
27
+ ~WordCountList() { clear(); };
28
+ int size() const { return words.size(); };
29
+ // 単語を挿入. すでにあれば,出現回数をインクリメント
30
+ void insert(const std::string& w) {
31
+ Node node(w,1);
32
+ auto iter = std::lower_bound(words.begin(), words.end(), node);
33
+ if ( iter != words.end() && iter->first == w ) iter->second++;
34
+ else words.insert(iter, node);
35
+ }
36
+ // 単語を削除. 1回減算,或は,ノード削除
37
+ void remove(const std::string& w) {
38
+ Node node(w, 0);
39
+ auto iter = std::lower_bound(words.begin(), words.end(), node);
40
+ if ( iter != words.end() && iter->first == w) {
41
+ if ( --iter->second <= 0 ) words.erase(iter);
42
+ }
43
+ }
44
+ //単語と出現回数をアルファベット順に昇順表示
45
+ void print() const {
46
+ for ( auto iter = words.cbegin(); iter != words.cend(); ++iter ) {
47
+ std::cout << iter->first << "(" << iter->second << ") ";
48
+ }
49
+ }
50
+ //単語と出現回数をアルファベット順とは反対に降順表示
51
+ void printR() const {
52
+ for (auto iter = words.crbegin(); iter != words.crend(); ++iter) {
53
+ std::cout << iter->first << "(" << iter->second << ") ";
54
+ }
55
+ }
56
+ };
57
+
58
+ int main() {
59
+ using namespace std;
60
+ int stop = 0; // loop stop flag;
61
+ int n, ct, num;
62
+ char select;
63
+ string input, w;
64
+
65
+ WordCountList wlist;
66
+ while (!stop && cout << " Select I/R/S/P/p/C/W/T/t/Q-->" && cin >> select) {
67
+ switch (select) {
68
+ case 'I': case 'i': cin >> w; wlist.insert(w); break;
69
+ case 'R': case 'r': cin >> w; wlist.remove(w); break;
70
+ case 'S': case 's': cout << "List length = " << wlist.size() << " nodes" << endl; break;
71
+ case 'p': wlist.print(); break; // ascending order
72
+ case 'P': wlist.printR(); break; // descending order
73
+ case 'Q': case 'q': stop = 1; break;
74
+ default: cerr << "Command Error\n"; stop = 1;
75
+ }
76
+ }
77
+ return 0;
78
+ }
9
79
  ```