RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / user-653145

Treeesk's questions

Martin Hope
Treeesk
Asked: 2024-12-05 02:54:26 +0000 UTC

帮我解决一个C语言的问题

  • 5

我面临的任务是:练习 6.2。编写一个程序,读取 C 程序的文本,并按字母顺序打印所有变量名称组,其中前 6 个字符相同,但后续字符在某些方面有所不同。不要处理引用的字符串和注释的内部。将数字 6 设置为在命令行上指定的参数。我用更简化的版本解决了它,并简单地处理了输入到终端中的单词。我将它们全部放置为一棵大二叉树,其节点也是树,但具有相同的 N 个字母。我希望我的程序不输出那些包含一个单词的树,我该如何更改程序以使其正常工作。

   
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>



struct tnode { /* узел дерева */
    char *word; /* указатель на текст */
    struct tnode *left; /* левый сын */
    struct tnode *right; /* правый сын */
    int count; // подсчет количества слов в узле
};


struct tree_of_trees {
    struct tnode *bin_tree;
    struct tree_of_trees *left_son;
    struct tree_of_trees *right_son;
};



/* talloc: создает tnode */
struct tnode *talloc(void)
{
    return (struct tnode *) malloc(sizeof(struct tnode));
}


char *strdup_(char *s) /* делает дубликат s */
{
    char *p;
    p = (char *) malloc(strlen(s)+1); /* +1 для '\0' */
    if (p != NULL)
        strcpy(p, s);
    return p;
}

/* addtree: добавляет узел со словом w в р или ниже него */
struct tnode *addtree(struct tnode *p, char *w)
{
    int cond;
    if (p == NULL) { /* слово встречается впервые */
        p = talloc(); /* создается новый узел */
        p->word = strdup_(w);
        p->left = p->right = NULL;
        p -> count = 1;
    }
    else if ((cond = strcmp(w, p -> word)) < 0){ /* меньше корня левого поддерева */
        p->left = addtree(p->left, w);
        p -> count++;
    }
    else if (cond > 0){ /* больше корня правого поддерева */
        p->right = addtree(p->right, w);
        p -> count++;
    }
    return p;
}

struct tree_of_trees *balloc(void)
{
    return (struct tree_of_trees *) malloc(sizeof(struct tree_of_trees));
}

char *skip_n(char *word, int n){
    return &word[n + 1];
}

char *check_n(char *word, int n){
    char *p, *w;
    p = w = word;
    for (int i = 1; i < n; i++)
        *++w = *(++word);

    return p;
}


struct tree_of_trees *big_tree(struct tree_of_trees *p, struct tnode *vet, int n){
    int cond;
    if (vet == NULL) return p;
    if (p == NULL){
        p = balloc();
        p->bin_tree = vet;
        p->left_son = p->right_son = NULL;
    }
    if (strcmp(check_n(vet->word, n), check_n(p -> bin_tree -> word, n)) == 0){ 
        if ((cond = strcmp(skip_n(vet->word, n), skip_n(p -> bin_tree -> word, n))) < 0)
            p -> left_son = big_tree(p->left_son, vet, n);
        else if (cond > 0)
            p -> right_son = big_tree(p->right_son, vet, n);
    }
    return p;
}


#define BUFSIZE 100
char buf[BUFSIZE]; // буфер для ungetch
int bufp = 0; // след. свободная позиция в буфере
int getch(void) // взять (возможно возращенный) символ 
{   
    return (bufp > 0) ? buf[--bufp] : getchar();
}

void ungetch(int c) // вернуть символ на ввод. Чтобы избежать потери какого-либо символа и непредвиденных ошибок.
{
    if (bufp >= BUFSIZE)
        printf("ungetch: a lot of symbols\n");
    else
        buf[bufp++] = c;
}


/* getword: принимает следующее слово или символ из ввода */
int getword (char *word, int lim)
{   
    char c;
    char *w = word;
    while (isspace(c = getch()));
    if (c != EOF)
        *w++ = c;
    if (!isalpha(c)) {
        *w = '\0';
        return c;
    }
    for ( ; --lim > 0; w++)
        if (!isalnum(*w = getch())) {
            ungetch(*w);
            break;
        }
    *w = '\0';
    return word[0];
}

void treeprint_(struct tnode *a);
// Печать дерева(из деревьев) отсортированного по алфавиту 
void bigtreeprint(struct tree_of_trees *p){
    if (p != NULL){
        bigtreeprint(p -> left_son);
        treeprint_(p -> bin_tree);
        bigtreeprint(p -> right_son);
    }   
}

/* treeprint: упорядоченная печать дерева р */
void treeprint_(struct tnode *p)
{  
    if (p != NULL) {
        treeprint_(p->left);
        printf("%s\n", p->word);
        treeprint_(p->right);
    }
}

void free_tree(struct tnode *p) {
    if (p != NULL) {
        free_tree(p->left);
        free_tree(p->right);
        free(p->word);
        free(p);
    }
}

void free_big_tree(struct tree_of_trees *p) {
    if (p != NULL) {
        free_big_tree(p->left_son);
        free_big_tree(p->right_son);
        free_tree(p->bin_tree);
        free(p);
    }
}

int main(int argc, char *argv[])
{   
    int n = 6;
    while (--argc > 0) n = atoi(*++argv);
    struct tnode *root_internal;
    struct tree_of_trees *root_main;
    char word[100];
    root_main = NULL;
    root_internal = NULL;
    while (getword (word, 100) != EOF){
        if ((isalpha(word[0]) || word[0] == '_') && strlen(word) > n){
            root_main = big_tree(root_main, root_internal, n);
            root_internal = addtree(root_internal, word);
        }
    }
    bigtreeprint(root_main);
    free_big_tree(root_main);


    return 0;
}
c
  • 1 个回答
  • 68 Views

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5