Advertisement
Guest User

Untitled

a guest
May 20th, 2019
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.50 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. #include <stdbool.h>
  6. #define COUNT 10
  7.  
  8. FILE *f;
  9. char *name = "my_file";
  10.  
  11. struct tnode {                // узел дерева
  12.     char *word;                  // указатель на строку (слово)
  13.     struct tnode *left;          // левый потомок
  14.     struct tnode *right;         // правый потомок
  15. };
  16. struct tnode *root;
  17.  
  18. struct tnode *addtree(struct tnode *root, char *w) {    //функция создания дерева
  19.     int cond;
  20.     if (root == NULL) {                                 //если корня нет
  21.         root = (struct tnode *)malloc(sizeof(struct tnode));    //выделение памяти на корень
  22.         root->word = strdup(w);                                 //запись значения в корень
  23.         root->left = root->right = NULL;                        //приравнивание левой и правой ветки нулю
  24.     }
  25.     else if (cond = strcmp(w, root->word) < 0)          //если корень есть, то сравнивает слово с корнем
  26.         root->left = addtree(root->left, w);            //добавляет его в левую ветку
  27.     else
  28.         root->right = addtree(root->right, w);          //добавляет его в правую ветку
  29.     return root;
  30. }
  31.  
  32.  
  33. void print2DUtil(struct tnode *root, int space)         //функция вывода дерева
  34. {
  35.     if (root == NULL) {
  36.         return;
  37.     }
  38.     space += COUNT;
  39.    
  40.     print2DUtil(root->right, space);
  41.    
  42.     printf("\n");
  43.     for (int i = COUNT; i < space; i++) {
  44.         printf(" ");
  45.     }
  46.     printf("%s\n", root->word);
  47.    
  48.     print2DUtil(root->left, space);
  49. }
  50.  
  51.  
  52. void Read(){                                                //функция чтения с текстового файла и построения дерева
  53.     char *typ[5];                                           //массив с основными типами идентификаторов
  54.     typ[0] = "char";
  55.     typ[1] = "int";
  56.     typ[2] = "float";
  57.     typ[3] = "double";
  58.     typ[4] = "bool";
  59.     char *p, *temp[255], tmp[255];                          //временные переменные
  60.     int n = 0, k = 0;                                       //переменная счетчиков
  61.     char *hram[255];                                        //переменная куда записываются данные
  62.     int w = 0, val[255][255];
  63.     root =NULL;
  64.    
  65.     char str[255];
  66.     f = fopen("/Users/andrew/Desktop/Прога/LAB 7 Kovaluk/LAB 7 Kovaluk/my_file.txt", "r");      //открываем файл
  67.     if (f = fopen("/Users/andrew/Desktop/Прога/LAB 7 Kovaluk/LAB 7 Kovaluk/my_file.txt", "r")) {
  68.         while (!feof(f)) {                                  //пока не конец файла - считываем данные
  69.             fgets(str, 255, f);
  70.            
  71.             n = 0;
  72.             k = 0;
  73.            
  74.             p = strtok(str, " ;[]*-&)(,+_?=><");            //отсекаем лишние символы
  75.             for (int i = 0; i < strlen(p); i++) {
  76.                 if (p[i] != '\t') {
  77.                     tmp[k] = p[i];
  78.                     k++;
  79.                 }
  80.             }
  81.             tmp[k] = '\0';
  82.             p = strdup(tmp);
  83.             while (p) {
  84.                 temp[n] = strdup(p);
  85.                 n++;
  86.                 p = strtok(NULL, " ;[]*-&)(,+_?=><");
  87.             }
  88.             for (int i = 0; i < n; i++) {
  89.                 for (int j = 0; j < 5; j++) {
  90.                     if (strcmp(temp[i], typ[j]) == 0) {
  91.                         hram[w] = strdup(temp[i + 1]);
  92.                         w++;
  93.                     }
  94.                 }
  95.             }
  96.         }
  97.         for (int i = 0; i < w; i++) {
  98.             for (int j = 0; j < w; j++) {
  99.                 if (strcmp(hram[i], hram[j]) == 0 && i != j) {
  100.                     for (int k = j; k < w; k++) {
  101.                         hram[k] = (hram[k + 1]);
  102.                     }
  103.                     w--;
  104.                 }
  105.             }
  106.         }
  107.         rewind(f);                                                          //переходим к началу файла
  108.        
  109.         int str_num = 0;
  110.         int shet[255];
  111.        
  112.         for (int i = 0; i<255; i++)
  113.         {
  114.             shet[i] = 0;
  115.         }
  116.        
  117.         bool flag = 0;                                                      //переменная флага
  118.        
  119.         while (!feof(f)) {
  120.             fgets(str, 255, f);
  121.             str_num++;
  122.             n = 0;
  123.             k = 0;
  124.             p = strtok(str, " ;[]*-&)(,+_?=><");
  125.             for (int i = 0; i < strlen(p); i++) {
  126.                 if (p[i] != '\t') {
  127.                     tmp[k] = p[i];
  128.                     k++;
  129.                 }
  130.             }
  131.             tmp[k] = '\0';
  132.             p = strdup(tmp);
  133.             while (p) {
  134.                 temp[n] = strdup(p);
  135.                 n++;
  136.                 p = strtok(NULL, " ;[]*-&)(,+_?=><");
  137.             }
  138.             for (int i = 0; i < n; i++) {
  139.                 for (int l = 0; l < w; l++) {
  140.                     if (strcmp(temp[i], hram[l]) == 0) {
  141.                         //val[l]++;
  142.                         val[l][shet[l]] = str_num;
  143.                        
  144.                         flag = 1;
  145.                         shet[l]++;
  146.                         break;
  147.                     }
  148.                 }
  149.                 if (flag == 1){
  150.                     break;
  151.                 }
  152.             }
  153.             flag = 0;
  154.            
  155.         }
  156.         char *identificator[256];
  157.         char *kolichestvo;
  158.         char strr[20];
  159.         printf("Readed from file: \n");
  160.         for (int i = 0; i < w; i++)
  161.         {                                       //вывод идентификатора, и места, где встречается
  162.             printf("%s-", hram[i]);
  163.             identificator[i] = hram[i];
  164.            
  165.             for (int j = 0; j<shet[i]; j++)
  166.             {
  167.                 printf("%d, ", val[i][j]);
  168.                 sprintf(strr, "% d ", val[i][j]);
  169.                 kolichestvo = strr;
  170.                 strncat(identificator[i], kolichestvo, 128);
  171.             }
  172.             printf("\n");
  173.            
  174.             root = addtree(root, identificator[i]);             //добавление ветки с идентификатором
  175.         }
  176.     }
  177.     else {
  178.         printf("File not found");       //ошибка открытия файла
  179.     }
  180.    
  181. }
  182.  
  183. int main(){
  184.     printf("LAB: 7 Binary tree of search\nBershadskiy Andrew \nIS-81\n ");
  185.     int key;
  186.     system("pause");
  187.     while (true)
  188.     {
  189.     start:
  190.         //system("cls");
  191.         printf("\n\t MENU \n\n");                                   //меню
  192.         printf("1.Read from file and display tree\n");
  193.         printf("2.Exit\n\n");
  194.         printf("Choose option:");
  195.         scanf("%d", &key);
  196.         switch (key)
  197.         {
  198.                
  199.             case 1:{
  200.                 //system("cls");
  201.                 Read();
  202.                 printf("\nTree\n");
  203.                 treeprint(root);
  204.                 print2DUtil(root, 0);
  205.                 getchar();
  206.             }
  207.                 goto start;
  208.             case 2:{
  209.                 printf("Goodbye!\n");
  210.                 getchar();
  211.                 return 0;
  212.             }
  213.         }
  214.     }
  215. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement