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;
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
のように,この条件を満たしていませんが(temp というsecondary data structureを使っている,new Nodeのところで,create new nodesを実行している),動くことは動きます.
動作チェックをおこなうプログラム 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/13(日) 23:59です.締切を過ぎても2021年7月末までは6割を上限に採点します.