#include <iostream>
#include <fstream>
#include <strstream>
#include <cstring>
#include <cctype>
#define KEY_LEN 12
struct List {
char key[KEY_LEN];
List* next;
};
//добавление
bool List_Add(List*& lst, const char* key){
int cmp;
List** ref = &lst;
List* pos = lst;
while(pos != NULL){
cmp = strcmp(key, pos->key);
if(! cmp)
return false;
else if(cmp < 0)
break;
ref = &pos->next;
pos = pos->next;
}
List* ptr = new (std::nothrow) List();
if(ptr == NULL)
return false;
ptr->next = pos;
strcpy(ptr->key, key);
*ref = ptr;
return true;
}
//получение ключей из входного потока
void List_GetKeys(List*& lst, std::istream& _in){
char key[KEY_LEN], *p = &key[0];
int ch;
do {
ch = _in.get();
if(isalpha(ch)){
if((p - &key[0]) < (KEY_LEN - 1))
*p++ = ch;
*p = '\0';
} else {
if(p > &key[0]){
List_Add(lst, key);
p = &key[0];
}
}
} while((ch != EOF) && (! _in.fail()));
}
//удаление
void List_Clear(List*& lst){
List* tmp;
while(lst != NULL){
tmp = lst;
lst = lst->next;
delete tmp;
}
}
int main(void){
List* lst = NULL;
const char s[] = "XOR, XOR, (OR), AND, NOT, AND, AND, ~NOT, OR, ABC";
std::istrstream sp(s);
List_GetKeys(lst, sp);
/* работа с файлом
std::ifstream fp("input.txt");
List_GetKeys(lst, fp);
fp.close();
*/
for(const List* p = lst; p != NULL; p = p->next)
std::cout << p->key << std::endl;
List_Clear(lst);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnN0cmVhbT4KI2luY2x1ZGUgPHN0cnN0cmVhbT4KI2luY2x1ZGUgPGNzdHJpbmc+CiNpbmNsdWRlIDxjY3R5cGU+CiNkZWZpbmUgIEtFWV9MRU4gICAxMgoKc3RydWN0IExpc3QgewoJY2hhciAga2V5W0tFWV9MRU5dOwoJTGlzdCogbmV4dDsKfTsKCi8v0LTQvtCx0LDQstC70LXQvdC40LUKYm9vbCBMaXN0X0FkZChMaXN0KiYgbHN0LCBjb25zdCBjaGFyKiBrZXkpewoJaW50ICAgIGNtcDsKCUxpc3QqKiByZWYgPSAmbHN0OwoJTGlzdCogIHBvcyA9IGxzdDsKCQoJd2hpbGUocG9zICE9IE5VTEwpewoJCWNtcCA9IHN0cmNtcChrZXksIHBvcy0+a2V5KTsKCQlpZighIGNtcCkKCQkJcmV0dXJuIGZhbHNlOwoJCWVsc2UgaWYoY21wIDwgMCkKCQkJYnJlYWs7CgkJcmVmID0gJnBvcy0+bmV4dDsKCQlwb3MgPSBwb3MtPm5leHQ7Cgl9CgoJTGlzdCogcHRyID0gbmV3IChzdGQ6Om5vdGhyb3cpIExpc3QoKTsKCWlmKHB0ciA9PSBOVUxMKQoJCXJldHVybiBmYWxzZTsKCglwdHItPm5leHQgPSBwb3M7CglzdHJjcHkocHRyLT5rZXksIGtleSk7CgkqcmVmID0gcHRyOwoJcmV0dXJuIHRydWU7Cn0KCi8v0L/QvtC70YPRh9C10L3QuNC1INC60LvRjtGH0LXQuSDQuNC3INCy0YXQvtC00L3QvtCz0L4g0L/QvtGC0L7QutCwCnZvaWQgTGlzdF9HZXRLZXlzKExpc3QqJiBsc3QsIHN0ZDo6aXN0cmVhbSYgX2luKXsKCWNoYXIga2V5W0tFWV9MRU5dLCAqcCA9ICZrZXlbMF07CglpbnQgIGNoOwoJCglkbyB7CgkJY2ggPSBfaW4uZ2V0KCk7CgkJaWYoaXNhbHBoYShjaCkpewoJCQlpZigocCAtICZrZXlbMF0pIDwgKEtFWV9MRU4gLSAxKSkKCQkJCSpwKysgPSBjaDsKCQkJKnAgPSAnXDAnOwoJCX0gZWxzZSB7CgkJCWlmKHAgPiAma2V5WzBdKXsKCQkJCUxpc3RfQWRkKGxzdCwga2V5KTsKCQkJCXAgPSAma2V5WzBdOwoJCQl9CgkJfQoJfSB3aGlsZSgoY2ggIT0gRU9GKSAmJiAoISBfaW4uZmFpbCgpKSk7Cn0KCi8v0YPQtNCw0LvQtdC90LjQtQp2b2lkIExpc3RfQ2xlYXIoTGlzdComIGxzdCl7CglMaXN0KiB0bXA7Cgl3aGlsZShsc3QgIT0gTlVMTCl7CgkJdG1wID0gbHN0OwoJCWxzdCA9IGxzdC0+bmV4dDsKCQlkZWxldGUgdG1wOwoJfQp9CgoKaW50IG1haW4odm9pZCl7CglMaXN0KiBsc3QgPSBOVUxMOwoJY29uc3QgY2hhciBzW10gPSAiWE9SLCBYT1IsIChPUiksIEFORCwgTk9ULCBBTkQsIEFORCwgfk5PVCwgT1IsIEFCQyI7CglzdGQ6OmlzdHJzdHJlYW0gc3Aocyk7CglMaXN0X0dldEtleXMobHN0LCBzcCk7CgovKiAg0YDQsNCx0L7RgtCwINGBINGE0LDQudC70L7QvAoJc3RkOjppZnN0cmVhbSBmcCgiaW5wdXQudHh0Iik7CglMaXN0X0dldEtleXMobHN0LCBmcCk7CglmcC5jbG9zZSgpOwoqLwoJZm9yKGNvbnN0IExpc3QqIHAgPSBsc3Q7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCgkJc3RkOjpjb3V0IDw8IHAtPmtleSA8PCBzdGQ6OmVuZGw7CgoJTGlzdF9DbGVhcihsc3QpOwoJcmV0dXJuIDA7Cn0=