Реализации различных алгоритмов на Си / Сортировка - с помощью дерева (нет блок схемы)
.docТекст программы
#include <stdio.h>
#include <windows.h>
void PRINT(char str[]) {
char buf[200];
CharToOem(str,buf);
printf("%s ",buf);
}
typedef struct tree {
int a;
struct tree *left;
struct tree *right;
} TREE;
TREE *add_to_tree(TREE *root, int new_value){
if (root==NULL) {
root = (TREE*)malloc(sizeof(TREE));
root->a = new_value;
root->left = root->right = 0;
return root;
}
if (root->a < new_value)
root->right = add_to_tree(root->right, new_value);
else
root->left = add_to_tree(root->left, new_value);
return root;
}
void tree_to_array(TREE *root, int a[]) {
static max2=0;
if (root==NULL) return;
tree_to_array(root->left, a);
a[max2++] = root->a;
tree_to_array(root->right, a);
free(root);
}
void sort_tree(int a[], int elem_total) {
TREE *root;
int i;
root = NULL;
for (i=0;i<elem_total;i++) root = add_to_tree(root, a[i]);
tree_to_array(root, a);
}
void main(void) {
FILE* file_from, *file_to;
int *arr;
int fend,i=0,j;
char in_name[40],out_name[40];
PRINT("Имя файла данных: ");
scanf("%s",&in_name);
PRINT("Имя выходного файла: ");
scanf("%s",&out_name);
file_from = fopen(in_name,"r");
file_to = fopen(out_name,"w+");
if (file_from != NULL) {
fseek(file_from,0,SEEK_END);
fend = ftell(file_from);
arr = (int*)malloc(fend*sizeof(int));
fseek(file_from,0,SEEK_SET);
PRINT("Данные из файла");
printf("%s",in_name);
PRINT(" до сортировки:\n");
while (ftell(file_from) < fend) {
fscanf(file_from,"%d",&arr[i]);
printf("%d ",arr[i]);
i++;
}
PRINT("\n\nДанные после сортировки, которые будут записаны в файл");
printf("%s:\n",out_name);
sort_tree(arr,i);
for (j=0;j<i;j++) {
fprintf(file_to,"%d ",arr[j]);
printf("%d ",arr[j]);
}
}else PRINT("Ошибка. Нет такого файла данных!!!\n");
printf("\n\n");
system("pause");
}