fork(1) download
  1. #include <iostream>
  2. #include <fstream>
  3. #include <strstream>
  4. #include <cstring>
  5. #include <cctype>
  6. #define KEY_LEN 12
  7.  
  8. struct List {
  9. char key[KEY_LEN];
  10. List* next;
  11. };
  12.  
  13. //добавление
  14. bool List_Add(List*& lst, const char* key){
  15. int cmp;
  16. List** ref = &lst;
  17. List* pos = lst;
  18.  
  19. while(pos != NULL){
  20. cmp = strcmp(key, pos->key);
  21. if(! cmp)
  22. return false;
  23. else if(cmp < 0)
  24. break;
  25. ref = &pos->next;
  26. pos = pos->next;
  27. }
  28.  
  29. List* ptr = new (std::nothrow) List();
  30. if(ptr == NULL)
  31. return false;
  32.  
  33. ptr->next = pos;
  34. strcpy(ptr->key, key);
  35. *ref = ptr;
  36. return true;
  37. }
  38.  
  39. //получение ключей из входного потока
  40. void List_GetKeys(List*& lst, std::istream& _in){
  41. char key[KEY_LEN], *p = &key[0];
  42. int ch;
  43.  
  44. do {
  45. ch = _in.get();
  46. if(isalpha(ch)){
  47. if((p - &key[0]) < (KEY_LEN - 1))
  48. *p++ = ch;
  49. *p = '\0';
  50. } else {
  51. if(p > &key[0]){
  52. List_Add(lst, key);
  53. p = &key[0];
  54. }
  55. }
  56. } while((ch != EOF) && (! _in.fail()));
  57. }
  58.  
  59. //удаление
  60. void List_Clear(List*& lst){
  61. List* tmp;
  62. while(lst != NULL){
  63. tmp = lst;
  64. lst = lst->next;
  65. delete tmp;
  66. }
  67. }
  68.  
  69.  
  70. int main(void){
  71. List* lst = NULL;
  72. const char s[] = "XOR, XOR, (OR), AND, NOT, AND, AND, ~NOT, OR, ABC";
  73. std::istrstream sp(s);
  74. List_GetKeys(lst, sp);
  75.  
  76. /* работа с файлом
  77. std::ifstream fp("input.txt");
  78. List_GetKeys(lst, fp);
  79. fp.close();
  80. */
  81. for(const List* p = lst; p != NULL; p = p->next)
  82. std::cout << p->key << std::endl;
  83.  
  84. List_Clear(lst);
  85. return 0;
  86. }
Success #stdin #stdout 0s 3416KB
stdin
Standard input is empty
stdout
ABC
AND
NOT
OR
XOR