В чем заключается ошибка в представленном коде на языке C?

Добрый день! У меня возникла проблема с поиском ошибки в моем коде. Задание заключается в том, чтобы создать программу, которая печатает таблицу "перекрестных ссылок". Она должна выводить все слова из документа вместе с номерами строк, в которых они встречаются, при этом игнорируя "шумовые" слова, такие как "и", "или" и так далее. 

Я хотел бы, чтобы для каждого слова рядом выводился массив с номерами строк, в которых это слово встречается, но в текущем варианте выводится лишь номер первой строки, и на этом всё. При вводе: 
<br/> hello abfdbdbdf <br/> hello <br/> 
Я ожидаю увидеть:
<br/> hello 1 2 <br/> abfdbdbdf 1 <br/> 

Вот код, который я использую:
<pre><code class="cpp">
#include &lt;stdio.h&gt;
#include &lt;ctype.h&gt;
#include &lt;string.h&gt;
#include &lt;stdlib.h&gt;

#define C_OF_STR 100

struct tnode {
    char *word;
    int num_str[C_OF_STR];
    struct tnode *left;
    struct tnode *right;
    int last_el;
};

/* 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: добавляет слово в дерево */
struct tnode *addtree(struct tnode *p, char *word, int ind) {
    int cond;
    if (p == NULL) {
        p = talloc();
        p-&gt;word = strdup_(word);
        p-&gt;last_el = 0;
        p-&gt;num_str[p-&gt;last_el++] = ind;
        p-&gt;left = p-&gt;right = NULL;
    }
    else if ((cond = strcmp(word, p-&gt;word)) == 0) {
        // Если слово уже есть, добавляем индекс в массив
        if (ind != p-&gt;num_str[p-&gt;last_el - 1]) {
            if (p-&gt;last_el &lt; C_OF_STR) {
                p-&gt;num_str[p-&gt;last_el++];
            }
        }
```
</code></pre>
  • 9 декабря 2024 г. 7:53
Ответы на вопрос 2
Спасибо за предоставленный код. Основная ошибка в вашем коде заключается в том, что при добавлении нового индекса строки в массив `num_str[]` вы не присваиваете значение индекса, а просто увеличиваете `last_el`, не записывая индекс строки. Кроме того, есть проблема с тем, как используются указатели, а также может быть недостающая часть кода, чтобы корректно вернуть и вывести значения.

Вот исправленные моменты в вашей функции `addtree`. Обратите внимание на строку `p->num_str[p->last_el++] = ind;`, которую нужно будет исправить, иначе вы не сохраняете значение `ind`.

Вот исправленный фрагмент кода:

```c
struct tnode *addtree(struct tnode *p, char *word, int ind) {
    int cond;
    if (p == NULL) {
        p = talloc();
        p->word = strdup_(word);
        p->last_el = 0;
        p->num_str[p->last_el++] = ind; // Сохранение индекса первой строки
        p->left = p->right = NULL;
    } else if ((cond = strcmp(word, p->word)) == 0) {
        // Если слово уже есть, добавляем индекс в массив
        if (ind != p->num_str[p->last_el - 1]) { // Убедитесь, что индекс не дублируется
            if (p->last_el < C_OF_STR) {
                p->num_str[p->last_el++] = ind; // Запись индекса в массив
            }
        }
    } else if (cond < 0) {
        p->left = addtree(p->left, word, ind);
    } else {
        p->right = addtree(p->right, word, ind);
    }
    return p;
}
```

Дополнительно вам потребуется код для обхода дерева и печати результата, чтобы убедиться, что слова и их индексы корректно выводятся. Пример функции для обхода дерева и вывода:

```c
void treeprint(struct tnode *p) {
    if (p != NULL) {
        treeprint(p->left);
        printf("%s ", p->word);
        for (int i = 0; i < p->last_el; i++) {
            printf("%d ", p->num_str[i]);
        }
        printf("\n");
        treeprint(p->right);
    }
}
```

Добавьте эти исправления и проверьте, исправляет ли это вашу проблему с выводом индексов строк. Убедитесь также, что в вашем основном коде есть процедура для считывания слов из документа и вызова функции `addtree()`.
В строке 
while (isspace(c = getch())); // Пропуск пробелов
\n принимается за пробел и не возвращается из функции. В результате счётчик номеров строк не меняется.
Похожие вопросы