Hirdetés

Új hozzászólás Aktív témák

  • blaces

    tag

    Közben a harmadikkal is foglalkozom... szinte egésznap, lehet a fáradtságtól nem tudok már oda figyelni rendesen.
    Feladat:
    [I]Írj programot, amely egy egész számokat tartalmazó szöveges állományból felépít egy bináris fát, és eldönti, hogy a fa inorder és preorder bejárásával ugyanazt a számsorozatot kapja-e! A számokat tartalmazó állomány nevét az első parancssori argumentumként kapja meg a program.

    A szöveges állomány soronként pontosan egy tízes számrendszerbeli egész számot tartalmaz. A sorokat az újsor karakter (\n) zárja. Az állományt az állomány vége (EOF) jelig kell olvasni.

    A bináris fa felépítésében két szabályt kell figyelembe venni. Ha a beszúrandó szám nagyobb, mint az, amelyik a gyökérben van, akkor a gyökértől jobbra kerüljön, ha kisebb vagy egyenlő, akkor a gyökér bal oldalára. Azaz ez a fa nem bináris keresőfa.

    A program járja be a fát inorder és preorder módon. Ha a két bejárás ugyanazt a számsorozatot adja eredményül, akkor a program a második parancssori argumentumként megkapott nevű állományba írja az "igen", különben a "nem" szót. [/I]

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>

    #define HAMIS 0
    #define IGAZ (!HAMIS)

    typedef struct faelem {

    char *adat;
    int szamlalas, input;
    struct faelem *bal, *jobb;
    } FA;

    void beszuras(FA **gyok, char *adat, int fajlnev) {
    if(*gyok == NULL) {
    *gyok = (FA*)malloc(sizeof(FA));
    (*gyok)->adat = (char*)malloc((strlen(adat)+1)*sizeof(char));
    strcpy((*gyok)->adat, adat);
    (*gyok)->szamlalas = 1;
    (*gyok)->input = fajlnev;
    (*gyok)->bal = (*gyok)->jobb = NULL;
    } else if(strcmp((*gyok)->adat, adat) < 0) {
    beszuras(&(*gyok)->jobb, adat , fajlnev);
    } else if(strcmp((*gyok)->adat, adat) > 0) {
    beszuras(&(*gyok)->bal, adat, fajlnev);
    } else if((strcmp((*gyok)->adat, adat) == 0) && ((*gyok)->input != fajlnev)) {
    (*gyok)->szamlalas++;
    (*gyok)->input = fajlnev;
    }

    return;
    }

    void bejaras(FA *gyok, int n) {
    if(gyok != NULL) {
    bejaras(gyok->bal, n);
    if(gyok->szamlalas == n) {
    printf("%s\n",gyok->adat);
    }
    bejaras(gyok->jobb, n);
    }
    return;
    }

    void torles(FA *gyok) {
    if(gyok != NULL) {
    free(gyok->adat);
    torles(gyok->bal);
    torles(gyok->jobb);
    free(gyok);
    }
    return;
    }

    int atugras(int ch) {
    if(ch != (int)' ' && ch != (int)'\n' && ch != (int)'\r' &&
    ch != (int)'\t' && ch != (int)'.' && ch != (int)',' && ch != (int)';' &&
    ch != (int)EOF) {
    return HAMIS;
    }

    return IGAZ;
    }

    char *memoriafoglalas(char *szo, int j) {
    return (szo == NULL) ?
    (char*)malloc(sizeof(char)) : (char*)realloc(szo,(j+1)*sizeof(char));
    }

    int main(int argc, char **argv) {
    FILE **fp = NULL;
    char *szo = NULL;
    int ch;
    FA *gyok = NULL;
    int i, j;

    if((fp = (FILE**)malloc((argc-1)*sizeof(FILE*)))==NULL)
    exit(1);
    for(i=1;i<argc;++i)
    if((fp[i-1] = fopen(argv[i],"rt+"))==NULL)
    exit(1);

    for(i=1;i<argc;++i) {
    j = 0;

    while((ch = fgetc(fp[i-1]))) {
    if((szo = memoriafoglalas(szo, j))==NULL)
    exit(1);

    if(atugras(ch) == HAMIS) {
    szo[j++] = tolower(ch);
    } else if(j > 0 || ch == (int)EOF) {
    szo[j] = '\0';
    beszuras(&gyok, szo, i-1);
    free(szo);
    szo = NULL;
    j = 0;

    if(ch == (int)EOF) {
    break;
    }
    }
    }
    fclose(fp[i-1]);
    }
    free(fp);
    bejaras(gyok, argc-1);
    torles(gyok);

    return 0;
    }

    Ez lefordul, csak hibás kimenetet ad vissza :( az egyetemi tesztelőn

    [ Szerkesztve ]

Új hozzászólás Aktív témák