Удалить из дерева все узлы, в текстах которых заданное слово, и указать количество удалений - 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);
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д