Удалить из дерева все узлы, в текстах которых заданное слово, и указать количество удалений - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток. Помогите, пожалуйста, с деревом 1) поля записей (структуры): <Ключ>, <Текст> - упорядочение за ключами; 2) прямой (от корня) слева направо, 3) удалить из дерева все узлы, в текстах которых заданное слово, и указать количество удалений 4) симметричный справа налево; 5) вытирания всего дерева.

Решение задачи: «Удалить из дерева все узлы, в текстах которых заданное слово, и указать количество удалений»

textual
Листинг программы
#include<stdio.h>
#include<ctype.h>  
#include<string.h> 
#include<stdlib.h>
#include <locale>
#define N 100
 
 
 
typedef struct info{
    int key;
    char *text;
} INFO;
typedef struct tree_node{
    INFO elem;
    struct tree_node *right, *left;
} TreeNode;
 
TreeNode* CreateNode(int ind, char *buf);           // ГґГіГ*êö³ÿ ñòâîðþº îäèГ* åëåìåГ*ГІ äåðåâГ*
void AddNode(TreeNode* pnew, TreeNode** root_adr);  // ГґГіГ*êö³ÿ ïðèºäГ*ГіВє åëåìåГ*ГІ äî äåðåâГ*
void PrintTreeNode(TreeNode* proot);                // äðóê ГўГ±ВіГµ åëåìåГ*ГІВіГў äåðåâГ*
void ShowTreeNode(TreeNode *proot, int lev);
void ShowLevels(void);                              // ГґГіГ*êö³ÿ âèâîäèòü Г*Г* ГҐГЄГ°Г*Г* Г*îìåðè ð³âГ*ВіГў äåðåâГ*
int TreeNodeHeight(TreeNode* proot);                // ГўГЁГ§Г*Г*Г·Г*Вє âèñîòó äåðåâГ*
void Del(char *word, TreeNode **pot);
void FreNod(TreeNode*p);
void FreeDer(TreeNode *p);
 
TreeNode *root; 
 
int main(void) {
    setlocale (LC_ALL, "rus");
    FILE *fp;                   // ГўГЄГ*ç³âГ*ГЁГЄ Г*Г* ГґГ*éëîâèé ïîò³ê
    TreeNode *node;             // ГўГЄГ*ç³âГ*ГЁГЄ çáåð³ãГ*òèìå Г*äðåñó îäГ*îãî åëåìåГ*ГІГі äåðåâГ*
    char name[15]="D:\\NEW.txt", buf[100], word[N];;    
    int b, n;           
    //printf("ÂâåäiГІГј iГ¬\'Гї ГґГ*éëó: ");
    //gets(name);               
    if((fp = fopen(name, "r")) == NULL) {
        puts("Г”Г*éë Г*ГҐ Г§Г*Г*éäåГ*Г®!!!");
        system ("pause");
        return 0; 
    }
    while(fscanf(fp, "%d %s", &b, buf) == 2) {      // ç÷èòóâГ*Г*Г*Гї Г¤Г*Г*ГЁГµ Г§ ГґГ*éëó
        node = CreateNode(b, buf);                  // ïåðåäГ*ºìî Г¤Г*Г*Ві äëÿ ñòâîðåГ*Г*Гї åëåìåГ*ГІГі äåðåâГ*, îòðèìóºìî Г*Г* Г*üîãî ГўГЄГ*ç³âГ*ГЁГЄ
        AddNode(node, &root);                       // ïåðåäГ*ºìî öåé ГўГЄГ*ç³âГ*ГЁГЄ Ві ГўГЄГ*ç³âГ*ГЁГЄ Г*Г* êîð³Г*Гј äåðåâГ* Гі ГґГіГ*êö³þ, ГїГЄГ* ïðèºäГ*Г*Вє Г*Г*Гё åëåìåГ*ГІ Гі ïîòð³áГ*ГҐ ì³ñöå äåðåâГ*
    }
    fclose(fp);         
 
    puts("\nÑôîðìîâГ*Г*ГҐ äåðåâî:\n");
    PrintTreeNode(root);        // äðóêóºìî Г¤Г*Г*Ві äåðåâГ* ïðÿìèì Г±ГЇГ°Г*ГўГ* Г*Г* ë³âî ïîðÿäêîì ïðîõîäæåГ*Г*Гї
    puts("\nÑòðóêòóðГ* äåðåâГ*:\n");
    ShowTreeNode(root,1);       // âèâîäèìî Г¤Г*Г*Ві Гі âèãëÿä³ äåðåâГ* ïîâåðГ*óòîãî Г*Г* 90 ГЈГ°Г*äóñ³â âë³âî
    puts("\nÑëîâî äëÿ ГўГЁГ¤Г*ëåГ*Г*Гї: ");
    gets(word);
    n = TreeNodeHeight(root);
    while (n){
          Del(word, &root);
          n--;
    }
    ShowTreeNode(root,1);
    getchar ();
    return 0;
}
    
TreeNode* CreateNode(int ind, char *buf){   // ГґГіГ*êö³ÿ ñòâîðþº îäèГ* åëåìåГ*ГІ äåðåâГ*
    TreeNode *pel;                                                              // ГўГЄГ*ç³âГ*ГЁГЄ Г*Г* îäèГ* åëåìåГ*ГІ äåðåâГ*
    
    pel = (TreeNode*)malloc(sizeof(TreeNode));  // âèä³ëÿºìî äëÿ Г*üîãî äèГ*Г*ì³÷Г*Гі ГЇГ*ìÿòü
    pel->left = pel->right = NULL;              
    
    pel->elem.text = (char*)malloc(strlen(buf)+1);  // âèä³ëÿºìî äèГ*Г*ì³÷Г*Гі ГЇГ*ìÿòü äëÿ Г*Г*çâè
    strcpy(pel->elem.text, buf);                        
    pel->elem.key = ind;    
 
    return pel; // ïîâåðòГ*ºìî ГўГЄГ*ç³âГ*ГЁГЄ Г*Г* Г*îâèé åëåìåГ*ГІ
}
 
void AddNode(TreeNode* pnew, TreeNode** root_adr){  // ïðèºäГ*Г*Г*Г*Гї åëåìåГ*ГІГі äî âïîðÿäêîâГ*Г*îãî äåðåâГ*
    TreeNode *proot = *root_adr;    // ГўГЄГ*ç³âГ*ГЁГЄ Г*Г* êîð³Г*Г*ГЁГ© åëåìåГ*ГІ
    if (proot == NULL) {            // ГїГЄГ№Г® åëåìåГ*ГІГі Г*ГҐ ВіГ±Г*ГіВє, Г*îâèé åëåìåГ*ГІ Г§Г*éìГ*Вє öå ì³ñöå
        *root_adr = pnew;
        return;
    }
    if(proot->elem.key == pnew->elem.key) free(pnew);
    if(proot->elem.key < pnew->elem.key) AddNode(pnew,&proot->right);
    if(proot->elem.key > pnew->elem.key) AddNode(pnew,&proot->left);
}
void PrintTreeNode(TreeNode* proot)                 // äðóêóºìî äåðåâî Гў ïðÿìîìó ïîðÿäêó çë³âГ* Г*Г*ГЇГ°Г*ГўГ®
{
    if (proot == NULL) 
        return;             // ГїГЄГ№Г® åëåìåГ*ГІГ* Г*ГҐ ВіГ±Г*ГіВє âèõ³ä
    printf(" %d. %s\n", proot->elem.key, proot->elem.text); 
    PrintTreeNode(proot->left);     
    PrintTreeNode(proot->right);    
}
 
void ShowTreeNode(TreeNode *proot, int lev){    // âèâîäèòü Г¤Г*Г*Ві Гі âèãëÿä³ äåðåâГ* ïîâåðГ*óòîãî Г*Г* 90 ГЈГ°Г*äóñ³â âë³âî
    if (lev == 1)   
        ShowLevels();               // ГїГЄГ№Г® öå êîð³Г*Гј âèâîäèìî Г*îìåðè ð³âГ*ВіГў äåðåâГ*
    if (proot == NULL) 
        return; 
    ShowTreeNode (proot->right, lev+1);             // ðóõГ*ºìîñü ГЇГ® ГЇГ°Г*âîìó ï³ääåðåâ³
    printf("%*c%d. %s\n", lev*8, ' ', proot->elem.key, proot->elem.text);   
    ShowTreeNode (proot->left, lev+1);              // ðóõГ*ºìîñü ГЇГ® ë³âîìó ï³ääåðåâ³
}
 
void ShowLevels(void){      // âèâîäèòü Г*îìåðè ð³âГ*ВіГў äåðåâГ*
    int level;
    printf("ГђiГўГҐГ*Гј:  ");
    for(level = 1; level <= TreeNodeHeight(root); level++)  
        printf("%-8d", level);
    printf("\n");
}
 
int TreeNodeHeight(TreeNode* proot)     // ГґГіГ*êö³ÿ ГўГЁГ§Г*Г*Г·Г*Вє âèñîòó äåðåâГ*
{
    int lht, rht;
    if (proot == NULL) 
        return 0;   
    lht = TreeNodeHeight(proot->left);  // ðóõГ*ºìîñü ГЇГ® ë³âîìó ï³ääåðåâ³
    rht = TreeNodeHeight(proot->right); // ðóõГ*ºìîñü ГЇГ® ГЇГ°Г*âîìó ï³ääåðåâ³
    if (lht > rht)
        return lht+1;
    else
        return rht+1;
}
 
void Del(char *word, TreeNode **pot){
    TreeNode *proot = *pot, *pnewr, *ppar;
    if(proot==NULL) return;
    int subtr;
    int cmp = strcmp(root->elem.text, word);
    if(cmp==0){
        if(proot->left==NULL && proot->right==NULL)
            subtr=0;
        else if( proot->left == NULL)
                 subtr= 1;
             else if( proot->right == NULL)
                      subtr = -1;
                  else subtr = 2;
        switch(subtr){
                      case(0): *pot=NULL; break;
                      case(-1): *pot=proot->left; break;
                      case(1): *pot= proot->right; break;
                      case(2):
                              pnewr=proot->left;
                              ppar=proot;
                              while(pnewr->right!=NULL){
                                     ppar = pnewr;
                                     pnewr = pnewr->right;
                              }
                              pnewr->right = proot->right;
                              if (pnewr != proot->left){
                                        ppar->right = pnewr->left;
                                        pnewr->left = proot->left;
                              }
                              *pot = pnewr;
        }
        FreeDer(root);
        return;
    }
    if(cmp>0)
         Del(word,&root->left);
    else
         Del(word,&root->right);
}
 
void FreNod(TreeNode*p){
        free(p->elem.text);
        free(p);
}
 
void FreeDer(TreeNode *p){
        FreeDer(p->left);   
        FreeDer(p->right);
        FreNod(p);
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.333 из 5
Похожие ответы