Beispiel #1
0
 void remove_rec(BSTNode* cur) {
   if (cur == nullptr) return;
   if (cur->left_ == nullptr && cur->right_ == nullptr) {
     remove_zero_child(cur);
     return;
   }
   if (cur->left_ == nullptr || cur->right_ == nullptr) {
     remove_one_child(cur);
     return;
   }
   BSTNode* p = cur->left_;
   while (p->right_ != nullptr) p = p->right_;
   std::swap(cur->key_, p->key_);
   remove_rec(p);
 }
Beispiel #2
0
 void remove(const Key& k) {
   BSTNode* cur = find_rec(this->root_, k);
   remove_rec(cur);
 }
Beispiel #3
0
void process() {
	int i;
	char line[100];
	char cmd, arg[100];
	bool done;
	rec_t rec;

	done = false;
	while (1) {
		printf("> ");
		fflush(stdout);

		if (!fgets(line, sizeof(line), stdin)) break;

		sscanf(line, "%c %[^\n]", &cmd, arg);

		switch (cmd) {
			FILE *fout, *fin;

			case 'i':
				snprintf(rec.name, sizeof(rec.name), "%s", arg);
				rec.x = 0;
				rec.y = 0;
				*rec.addr = '\0';

				if (insert_rec(root_idx, &rec)) {
					fprintf(stderr, "Duplicate found.\n");
				}
				break;

			case 'r':
				snprintf(rec.name, sizeof(rec.name), "%s", arg);
				remove_rec(root_idx, &rec);
				break;

			case 's':
				snprintf(rec.name, sizeof(rec.name), "%s", arg);
				if (!search_rec(root_idx, &rec)) {
					printf("Record found: ");
					rec_print(&rec);
					printf("\n");
				} else {
					fprintf(stderr, "Record not found.\n");
				}
				break;

			case 'p':
				fout = fopen("pout.txt", "w");
				print_node(fout, root_idx);
				fclose(fout);
				break;

			case 'k':
				fin = fopen("../names_200k.txt", "r");
				for (i=0;i<10000;i++) {
					if (!fgets(line, sizeof(line), fin)) break;

					if (*line) {
						char *end = line+strlen(line)-1;
						if (*end == '\n') *end = '\0';
					}

					snprintf(rec.name, sizeof(rec.name), "%s", line);
					remove_rec(root_idx, &rec);
				}
				fclose(fin);

				fout = fopen("pout.txt", "w");
				print_node(fout, root_idx);
				fclose(fout);
				break;

			case 'q':
				done = true;
				break;

			default:
				fprintf(stderr, "Invalid input.\n");
				break;
		}

		if (done) break;
	}

}