Orar semigroup #2

Orar semigroup #2

Laborator 6 - Arbori binari de cautare (1 aprilie)

Din fisier se citesc cuvinte (siruri de caractere, cu fscanf). Să se scrie un program care creează un arbore de căutare, care conţine în noduri cuvintele şi frecvenţa lor de apariţie. Să se afişeze apoi cuvintele în ordine lexicografică crescătoare şi frecvenţa lor de apariţie (parcurgere in inordine, S < R < D).
#include <stdio.h>  //  functia de cautare pt cresterea frecventei
#include <stdlib.h>
typedef struct tip_nod
{
    int f;
    char s[20];
    struct tip_nod *st, *dr;
} nod;
nod *rad;
void inserare_nerecursiva(char s[])
{
    nod *p,*q;
    int n;
    n=sizeof (nod);
    p=(nod*)malloc(n);
    strcpy(p->s,s);
    p->st=0;
    p->dr=0;
    if (rad==0)
    {
        rad=p;
        return;
    }
    q=rad;
    for ( ; ; )
    {
        if (strcmp(s,q->s)<0)
        {
            if (q->st==0)
            {
                q->st=p;
                return;
            }
            else q=q->st;
        }
        else if (strcmp(s,q->s)>0)
        {
            if (q->dr==0)
            {
                q->dr=p;
                return;
            }
            else q=q->dr;
        }
        else
        {
            p->f++;
            free (p);
            return;
        }
    }
}

void inordine(nod *p, int nivel)
{
    int i;
    if (p!=0)
    {
        inordine(p->st,nivel+1);
        //for(i=0; i<=nivel; i++) printf("  ");
        printf("%s %d\n",p->s,p->f);
        inordine(p->dr,nivel+1);
    }
}
int main()
{
    FILE *f;
    f=fopen("date.txt","r");
    char s[20];
    while(!feof(f))
    {
        fscanf(f,"%s",s);
        inserare_nerecursiva(s);
    }
    inordine(rad,0);
    printf("\nApasati o tasta pentru terminare");
    getch();
    return 0;
}

Functia sterge_nod
TIP_NOD *stergere_nod(TIP_NOD *rad,int key)
{
    TIP_NOD *p,*tata_p;/* p este nodul de sters, iar tata_p este tatal lui */
    TIP_NOD *nod_inlocuire,*tata_nod_inlocuire;/*nodul care il va inlocui pe p si tatal sau */ 
    int directie; /*stg=1;dr=2*/ 
    if(rad==0) return 0; /*arborele este vid */ 
    p=rad;
    tata_p=0;  /* cautare nod cu cheia key */ 
    while((p!=0)&&(p->cheie!=key))
    {
        if (key<p->cheie)
        {
            /*cautare in stanga */                                                
            tata_p=p;
            p=p->stg;
            directie=1;
        }
        else
        {
            /*cautare in dreapta */                           
            tata_p=p;
            p=p->dr;
            directie=2;
        }
    }
    if(p==0)
    {
        printf("\n NU EXISTA NOD CU CHEIA=%d\n",key);
        return rad;
    }      /* s-a gasit nodul p de cheie key */     
    if(p->stg==0)
        nod_inlocuire=p->dr; /* nodul de sters p nu are fiu sting */
    else if(p->dr==0) nod_inlocuire=p->stg;   /*nodul de sters p  nu are fiu drept*/     
    else
    {
        /* nodul de sters p are fiu stang si fiu drept */              
        tata_nod_inlocuire=p;
        nod_inlocuire=p->dr;        /* se cauta in subarborele drept*/              
        while(nod_inlocuire->stg!=0)
        {
            tata_nod_inlocuire=nod_inlocuire;
            nod_inlocuire=nod_inlocuire->stg;
        }
        if(tata_nod_inlocuire!=p)
        {
            tata_nod_inlocuire->stg=nod_inlocuire->dr;
            nod_inlocuire->dr=p->dr;
        }
        nod_inlocuire->stg=p->stg;
    }
    free(p);
    printf("\nNodul de cheie=%d a fost sters!\n",key);
    if(tata_p==0) 
        return nod_inlocuire; /*s-a sters chiar radacina initiala */      
    else
    {
        if (directie==1)
            tata_p->stg=nod_inlocuire;
        else tata_p->dr=nod_inlocuire;
        return rad;
    }
}
Tema: tabele de dispersie, probl 3.1 si 3.4
3.1 De la tastatură se citesc cuvinte ( şiruri de caractere ). Să se scrie un program care creează un arbore de căutare, care conţine în noduri cuvintele şi frecvenţa lor de apariţie. Să se afişeze apoi cuvintele în ordine lexicografică crescătoare şi frecvenţa lor de apariţie.

3.4 Se consideră două liste liniare simplu înlănţuite cu câmpurile de informaţie utilă conţinând numere întregi. Să se construiască o listă care conţine reuniunea celor două liste şi în care elementele sunt ordonate crescător. Se va folosi o structură intermediară de tip arbore de căutare. Elementele comune vor apare a o singură dată.
#include <stdio.h>
#include <stdlib.h>
typedef struct nodlista
{
    int x;
    struct nod *urm;
} nod;

typedef struct nodarbore
{
    int x;
    struct nod *st,*dr;
} nodarbore;

void inserare_lista(int x,nod **prim, nod **ultim)
{
    nod *p;
    p=(nod *)malloc(sizeof(nod));
    p->x=x;
    p->urm=NULL;

    if (*prim)
    {
        (*ultim)->urm=p;
        (*ultim)=p;
    }
    else
    {
        (*prim)=p;
        (*ultim)=p;
    }
}

void afisare(nod *prim)
{
    for (prim=prim; prim!=NULL; prim=prim->urm)
        printf("%d ",prim->x);
    printf("\n");
}

void creare_arbore(nodarbore **rad,int x)
{
    nodarbore *p,*q;
    p=(nodarbore *)malloc(sizeof(nodarbore));
    p->x=x;
    p->st=NULL;
    p->dr=NULL;
    q=(*rad);

    for (;;)
    {
        if (*rad)
        {
            if (x<q->x)
            {
                if (q->st==NULL)
                {
                    q->st=p;
                    return;
                }
                else
                    q=q->st;
            }
            else if (x>q->x)
            {
                if (q->dr==NULL)
                {
                    q->dr=p;
                    return;
                }
                else
                    q=q->dr;
            }
            else
                return;
        }
        else
        {
            (*rad)=p;
            return;
        }
    }
}

void arbore(nod *prim1,nod *prim2,nodarbore **rad)
{
    nod *p;
    for (p=prim1; p!=0; p=p->urm)
        creare_arbore(rad,p->x);

    for (p=prim2; p!=0; p=p->urm)
        creare_arbore(rad,p->x);
}

nod* lista_noua(nodarbore *a,nod **prim, nod **ultim)
{
    nod *p=NULL,*q;
    if (a)
    {
        p=(nod *)malloc(sizeof(nod));
        p->x=a->x;
        p->urm=NULL;
        q=lista_noua(a->st,prim,ultim);

        inserare_lista(a->x,prim,ultim);

        q=lista_noua(a->dr,prim,ultim);
    }
    return p;
}

void preordine(nodarbore *p, int nivel)
{
    int i;
    if (p!=0)
    {
        for(i=0; i<=nivel; i++)
            printf("  ");
        printf("%2d\n",p->x);
        preordine(p->st,nivel+1);
        preordine(p->dr,nivel+1);
    }
}

int main()
{
    int n,m,i,a;
    nod *prim1=0,*ultim1=0,*prim2=0,*ultim2=0,*prim=0,*ultim=0;
    FILE *f;

    f=fopen("date.txt","r");
    fscanf(f,"%d %d",&n,&m);
    for (i=1; i<=n; i++)
    {
        fscanf(f,"%d",&a);
        inserare_lista(a,&prim1,&ultim2);
    }

    for (i=1; i<=m; i++)
    {
        fscanf(f,"%d",&a);
        inserare_lista(a,&prim2,&ultim2);
    }

    afisare(prim1);
    afisare(prim2);
    printf("\nNoua lista\n");

    nodarbore *rad=NULL;
    arbore(prim1,prim2,&rad);

    //preordine(rad,0);
    lista_noua(rad,&prim,&ultim);
    afisare(prim);
    return 0;

}
Fisier date.txt
4 5
1 5 3 7
2 6 3 9 7

marți, 1 aprilie 2014 by DlMuresan
Categories: , , , | 1 comment

One Comment

  1. Nici un program nu lucreaza, well done!

Leave a Reply