カメヲラボ

主にプログラミングとお勉強全般について書いてます

Hire and Fire(1)

namasuteさん(http://d.hatena.ne.jp/namasute0/20060728)がさらりとすんばらしいコードを書いてくださったので読んでみました。う〜ん、やってることは同じだと思うんだけど、ダメです。

試しにnamasuteさんのコードを参考に、C++で書き直してみたら、Runtime Error。なんでじゃ〜


#include<iostream>
#include<list>
#include<string>
#include<map>

using namespace std;

class Tree{
public:
string name;
Tree *parent;
list<Tree*> children;
};

map<string, Tree*> mp;
char cmd[99],arg0[20],arg1[20],arg2[20];

void printLine(){
int i;
for(i=0;i<60;++i)printf("-");
puts("");
}

void print(Tree*t,int node){
for(int i=0;i<node;++i)cout<<"+";
cout<<t->name<<endl;
list<Tree*>::iterator p = t->children.begin();
for(;p!=t->children.end();++p)print(*p,node+1);
}

void fired(Tree*t){
if(t->children.empty()){
list<Tree*>::iterator p = t->parent->children.begin();
for(;p!=t->parent->children.end()&&(*p)->name!=t->name;++p);
delete *p;
t->parent->children.erase(p);
return;
}
Tree *child;
child = *(t->children.begin());
t->name = child->name;
fired(child);
mp.insert(make_pair(t->name, t));
}

void fire(string name){
map<string, Tree*>::iterator p;
p = mp.find(name);
fired(p->second);
}

void hire(string hirer, string hiree){
Tree* t = new Tree();
t->name = hiree;

map<string, Tree*>::iterator p;
p = mp.find(hirer);
Tree *parent = p->second;
t->parent = parent;
parent->children.push_back(t);

mp.insert(make_pair(hiree, t));
}

main(){
gets(arg0);
Tree* root = new Tree();
root->name = arg0;
mp.insert(make_pair(root->name, root));

for(;gets(cmd);){
switch(sscanf(cmd,"%s%s%s",arg0,arg1,arg2)){
case 1: print(root, 0); printLine(); break;
case 2: fire(arg1); break;
case 3: hire(arg0, arg2); break;
}
}
return 0;
}