Odczyt struktury drzewa z pliku tekstowego

Odpowiedz Nowy wątek
2014-12-14 12:38
0

Witam!
W pliku tekstowym mam drzewo zapisane w następującej postaci:

    4
5
            31
        151
    889

Chciałem napisać funkcję, której zadaniem byłoby wczytanie elementów do drzewa bazując tylko na strukturze, a nie na porównywaniu wartości. Jednakże na samym początku postanowiłem, że najpierw przy odczycie użyje wcześniej już napisanej funkcji dodaj. Problem polega na tym iż struktura odczytanego drzewa różni się od struktury drzewa w pliku:

 5
    31
        151
            889

Dlatego też będę szczęśliwy jeśli ktoś mi podpowie co robię źle, bym mógł to naprawić.

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
 
/*Definiowanie nowego typu danych - drzewa*/
typedef struct elD{
    int liczba;
    struct elD * prawy;
    struct elD * lewy;
} drzewo;
 
/*Zmienne globalne*/
drzewo *T = NULL, *q, *min, *max;
FILE *F;
int x, n, i;
char c;
 
/*Procedury dla drzewa binarnego*/
drzewo *dodaj(drzewo *T, int liczba){
    drzewo *p;
    if (T == NULL){
        p = malloc(sizeof(drzewo));
        p->liczba = liczba;
        p->lewy = p->prawy = NULL;
        return p;
    }
    else{
        if (T->liczba < liczba) T->prawy = dodaj(T->prawy, liczba);
        else T->lewy = dodaj(T->lewy, liczba);
        return T;
    }
}
 
void drukujDrzewo(drzewo *T, int glebokosc){
    if (T != NULL){
        drukujDrzewo(T->lewy, glebokosc + 1);
        for (i = 0; i < glebokosc; i++)
            putchar('\t');
        printf("%d\n", T->liczba);
        drukujDrzewo(T->prawy, glebokosc + 1);
    }   
}
 
drzewo *znajdz(drzewo *T, int liczba){
    if (T == NULL) return NULL;
    if (liczba < T->liczba) return znajdz(T->lewy, liczba);
    else if (liczba > T->liczba) return znajdz(T->prawy, liczba);
    else return T;
}
 
drzewo *usun(drzewo *T, int liczba){
    drzewo *W, *V;
    if (T != NULL){
        if (T->liczba > liczba){
            T->lewy = usun(T->lewy, liczba);
            return T;
        }
        if (T->liczba < liczba){
            T->prawy = usun(T->prawy, liczba);
            return T;
        }
        /*Przyjmujemy, że T->liczba = liczba*/
        W = T;
        if (W->lewy == NULL) V = W->prawy;
        else if (W->prawy == NULL) V = W->lewy;
        else{
            W = W->lewy;
            if (W->prawy == NULL){
                T->lewy = W->lewy;
                T->liczba = W->liczba;
                V = T;
            }
            else{
                V = T;
                while (W->prawy != NULL){
                    V = W;
                    W = W->prawy;
                }
                V->prawy = W->lewy;
                T->liczba = W->liczba;
                V = T;
            }
        }
        free(W);
        return V;
    }
}
 
drzewo *minimum(drzewo *T){
    if (T == NULL) return NULL;
    while (T->lewy)
        T = T->lewy;
    return T;
}
 
drzewo *maximum(drzewo *T){
    if (T == NULL) return NULL;
    while (T->prawy)
        T = T->prawy;
    return T;
}
 
void zapiszDrzewo(drzewo *T, FILE *F, int glebokosc){
    if (T != NULL){
        zapiszDrzewo(T->lewy, F, glebokosc + 1);;
        for (i = 0; i < glebokosc; i++)
            fprintf(F, "\t");
        fprintf(F, "%d\n", T->liczba);
        zapiszDrzewo(T->prawy, F, glebokosc + 1);
    }
}
 
void odczytajDrzewo(drzewo *T){
    char *temp = malloc(sizeof(char));
    int liczba, licznik = 0, n = 0;
    F = fopen("drzewo.txt", "rt");
    if (F == NULL){
        printf("Plik drzewo.txt nie istnieje!\n");
    }
    else{
        while ((c = fgetc(F)) != EOF){
            if (c >= '0' || c <= '9'){
                temp[n] = c;
                n++;
            }
            if (c == '\n'){
                liczba = atoi(temp);
                T = dodaj(T, liczba);
                for (i = 0; i < n; i++)
                    temp[i] = 0;
                n = 0; licznik = 0;
            }
            if (c == 't') licznik++;
        }
        if (feof(F)) fclose(F);
    }
}
 
/*Funkcja główna*/
int main(){
    printf("1. Dodawanie elementow do drzewa w sposob uporzadkowany\n");
    printf("2. Odczytanie zawartosci z pliku drzewo.txt\n");
    printf("Co wybierasz? "); scanf("%d", &n);
 
    system("cls");
 
    switch (n)
    {
    case 1:
        printf("Podaj elementy, ktore chcesz dodac do drzewa binarnego:\n");
        do{
            scanf("%d", &x);
            if (x != 0) T = dodaj(T, x);
        } while (x != 0);
        break;
    case 2:
        odczytajDrzewo(T);
        break;
    default:
        printf("\nZla opcja!\n");
        break;
    }
 
    printf("\nTwoje drzewo T:\n");
    drukujDrzewo(T, 0);
 
    if (T != NULL){
        printf("\nTwoje drzewo T:\n");
        drukujDrzewo(T, 0);
 
        min = minimum(T);
        max = maximum(T);
        printf("\nMinimum wynosi %d, a maksimum %d\n", min->liczba, max->liczba);
 
        getchar();
        printf("\nJaka liczbe chcesz wyszukac? "); scanf("%d", &x);
        q = znajdz(T, x);
        if (q == NULL) printf("\nNie znaleziono elementu w drzewie T.\n");
        else printf("\nZnaleziono element %d w drzewie T.\n", x);
 
        getchar();
        printf("\nJaka liczbe chcesz usunac? "); scanf("%d", &x);
        T = usun(T, x);
 
        printf("\nTwoje drzewo T:\n");
        drukujDrzewo(T, 0);
 
        getchar();
        printf("Czy chcesz zapisac drzewo do pliku drzewo.txt? ");
        scanf("%c", &c);
        if (c == 't'){
            F = fopen("drzewo.txt", "at");
            zapiszDrzewo(T, F, 0);
            fclose(F);
        }
 
    }
    else printf("\nTwoje drzewo jest puste!\n");
 
    getchar();
    getchar();
    return NULL;
}

Pozostało 580 znaków

2014-12-14 17:20
0
  1. Zrób sobie tablicę np levels[1000];
  2. Dla każdego wczytanego wiersza:
  3. Wyliczasz poziom w drzewie z ilości spacji Lvl
  4. Jeżeli levels[Lvl-1] nie jest NULL to wstawiasz nowy jako prawe dziecko tego levels[Lvl-1]
  5. W przeciwnym wypadku jeżeli levels[Lvl+1] nie jest NULL to to podpinasz ten levels[Lvl+1] jako lewe dziecko nowego oraz czyścisz levels[Lvl+1], niezależnie od warunku wstawiasz go w levels[Lvl]

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0