Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
ZimOne
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 84
1

Сортировка деревом

19.04.2015, 00:35. Просмотров 555. Ответов 2
Метки нет (Все метки)

Программа должна прочитать строку слов из файла и отсортировать деревом. На выходе программа почему-то выдает не N слов из файла в алфавитном порядке, а N раз последнее слово. Хотя та же самая программа с целыми числами работает правильно. Большая просьба посмотрите что не так в коде, уже 10 часов пытаюсь исправить, заранее спасибо


C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
//typedef char item_type; 
 
typedef struct tree {
    char *item; /*Элемент данных*/
    struct tree *parent; /*Указатель на родительский узел*/
    struct tree *left; /*Указатель на левый дочерний узел*/
    struct tree *right; /*Указатель на правый дочерний узел*/
}tree;
 
/*Функция печати дерева, получает на вход указатель на дерево*/
void print_tree (tree *l);
 
/*Функция вставки узла x в дерево l, с родительским узлом parent, содержащим l*/
void insert_tree (tree **l, char *x, tree *parent);
 
/*Функция инициализации дерева*/
tree *init_tree (void);
 
/*Функция поиска минимального элемента в дереве l*/
tree *find_minimum (tree *l);
 
/*Функция определения числа пробелов в строке, которую читает из файла fin*/
int func(FILE *fin);
 
int main(void)
{
    FILE *fin; int num, i, n; char str1[256];
    tree *l; char filename[256];
    l = init_tree();
    scanf("%s", &filename); 
    fin = fopen(filename, "r");
    if (!fin) return -1; /*Открываем файл, из которого считываем слова (ранее числа)*/
    n = func(fin); n++;
    for (i = 0; i < n; ++i) {
        fscanf(fin, "%s", &str1); printf("%s\n",str1);
        insert_tree(&l, str1, NULL);
    }
    print_tree(l);
    return 0;   
}
 
/*Функция печати дерева, получает на вход указатель на дерево*/
void print_tree (tree *l)
{
    if (l != NULL) {
        print_tree(l -> left);
            printf("%s ", l -> item); 
        print_tree(l -> right);
    }
}
 
/*Функция вставки узла x в дерево l, с родительским узлом parent, содержащим l*/
void insert_tree (tree **l, char *x, tree *parent)
{
    tree *p;
    if (*l == NULL) {
        p = malloc (sizeof (tree));
        p->item = x;
        p->left = p->right = NULL;
        p->parent = parent;
        *l = p;
        return;
    }
    if (x < (*l)->item)
        insert_tree (&((*l)->left), x, *l);
    else
        insert_tree (&((*l)->right), x, *l);
}
 
/*Функция инициализации дерева*/
tree *init_tree (void)
{
    return (NULL);
}
 
/*Функция поиска минимального элемента в дереве l*/
tree *find_minimum (tree *l)
{
    tree *min;
    if (l == NULL) return NULL;
    min = l;
    while (min->left != NULL)
        min = min->left;
    return min;
}
 
/*Функция определения числа пробелов в строке, которую читает из файла fin*/
int func(FILE *fin)
{
    rewind(fin);
    char str[256]; int n, nn = 0, i;
    fgets(str,256,fin);
    n=strlen(str);
    for (i = 0; i < n; ++i)
        if (str[i] == ' ')
            nn++;
    rewind(fin);
    return nn;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.04.2015, 00:35
Ответы с готовыми решениями:

Сортировка бинарным деревом
Получить число n на ввод; сделать сортировку бинарным деревом и построить...

Является ли граф деревом
Суть задачи заключается в том, что нужно проверить граф, является ли он...

Является ли граф - деревом?
Доброго времени суток. Есть граф, нужно пробежаться по нему в ширину, и если не...

Работа с деревом файлов/директорий
Подскажите, пожалуйста, как преобразовать список из файлов и папок...

Шаблонные функции работы с деревом
Добрый день. Задача: преобразовать готовые рекурсивные функции работы с...

2
nonedark2008
1051 / 785 / 220
Регистрация: 28.07.2012
Сообщений: 2,187
19.04.2015, 02:26 2
Цитата Сообщение от ZimOne Посмотреть сообщение
p->item = x;
Ты присваиваешь только указатель на одну и ту же строку.
Для примера можешь попробовать изменить "строку" x и посмотреть что происходит со "строкой" p->item.
0
ZimOne
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 84
19.04.2015, 14:20  [ТС] 3
Цитата Сообщение от nonedark2008 Посмотреть сообщение
на одну и ту же строку
Почему на одну и ту же? в цикле (в мейне) передается указатель на разные строки, отладочная печать показала что действительно на разные
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.04.2015, 14:20

Отобразить бинарным деревом предложение
Ребят прошу вашей помощи, буду очень признателен. Отобразить с помощью...

Операторы выполняемые над деревом
Не могу разобраться с задачкой. Может кто нибудь поможет? Напишите...

Разработать программу работы с бинарным деревом
Разработать программу работы с бинарным деревом. Программа должна содержать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru