Exercise 3.2 はメンバー変数 n を使わないことが条件になっています.この条件 定義を満たさない誤った secondLastを実装する例を示します.report3.tgzの中に含まれるSLList.hの中からincludeされているex3_2.hは,
T secondLast() { Node *u = head; for (int i = 0; i < n - 2; i++) u = u->next; return u->x; }のように,メンバー変数 n を使っていますが,動くことは動きます.
動作チェックをおこなうプログラム check_ex3_2.cppを
g++ --std=c++11 -Wall -O2 -o check_ex3_2 check_ex3_2.cppでコンパイルし.
./check_ex3_2で実行してOKが出ることで,このex3_2.hが正しく動作することを確認できます.以下のように,誤ったプログラム
T secondLast() { if (head == NULL) return null; Node *u = head; while (u->next != NULL) u = u->next; return u->x; }を実行すると,
NG l=[1, 2, 3, 4, 5] output: 5 expected: 4 ...のように,間違いを検出してくれます(このチェックプログラムで検出できない間違いもあります).なお,このプログラムは変数tailも変数nを使わずにlastを返す関数なので,secondLastを作る際にも参考になると思います.
report3.tgzの中に含まれるSLList.hの中からincludeされているex3_3.hの空白部分を埋めてください.
T get(int i){ // fill here } // to check each index until reaches i takes O(1+i) time T set(int i, T x){ // fill here } // runs in the same time as get(), for the same reason void add(int i, T x){ // fill here } T remove(int i){ // fill here }動作チェックをおこなうプログラム check_ex3_3.cppを
g++ --std=c++11 -Wall -O2 -o check_ex3_3 check_ex3_3.cppでコンパイルし.
./check_ex3_3で実行してOKが出ることで,このex3_3.hが正しく動作することを確認できます.誤ったプログラムを実行すると,
NG before=[] command: add 0 49 after=[]のように,間違いを検出してくれます.上のメッセージは空の状態([])からadd(0, 49) を実行したのに,[49] ではなく[]となったことを示しています.
Exercise 3.4 は "should not use any secondary data structures, and should not create any new nodes." という条件を満たす必要がありますが,report3.tgzの中に含まれるSLList.hの中からincludeされているex3_4.hは,
void reverse(){ if (head == NULL) return; std::vectorのように,この条件を満たしていませんが(temp というsecondary data structureを使っている,new Nodeのところで,create new nodesを実行している),動くことは動きます.temp; Node* u = head; while (u != NULL){ Node* next = u->next; temp.push_back(new Node(u->x)); delete u; u = next; } for (size_t i = 0; i < temp.size() - 1; i++) { temp[i + 1]->next = temp[i]; } head = temp[temp.size() - 1]; tail = temp[0]; } //Ex3_4
動作チェックをおこなうプログラム check_ex3_4.cppを
g++ --std=c++11 -Wall -O2 -o check_ex3_4 check_ex3_4.cppでコンパイルし.
./check_ex3_3で実行してOKが出ることで,このex3_4.hが正しく動作することを確認できます.誤ったプログラムを実行すると,間違いを検出できることもありますが,segmentation faultになることもあります.
締切は,6/14(日) 23:59です.締切を過ぎても2020年7月末までは6割を上限に採点します.