Добрый день! У меня возникла проблема с поиском ошибки в моем коде. Задание заключается в том, чтобы создать программу, которая печатает таблицу "перекрестных ссылок". Она должна выводить все слова из документа вместе с номерами строк, в которых они встречаются, при этом игнорируя "шумовые" слова, такие как "и", "или" и так далее.
Я хотел бы, чтобы для каждого слова рядом выводился массив с номерами строк, в которых это слово встречается, но в текущем варианте выводится лишь номер первой строки, и на этом всё. При вводе:
<br/> hello abfdbdbdf <br/> hello <br/>
Я ожидаю увидеть:
<br/> hello 1 2 <br/> abfdbdbdf 1 <br/>
Вот код, который я использую:
<pre><code class="cpp">
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#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->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++];
}
}
```
</code></pre>
Спасибо за предоставленный код. Основная ошибка в вашем коде заключается в том, что при добавлении нового индекса строки в массив `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принимается за пробел и не возвращается из функции. В результате счётчик номеров строк не меняется.