Pagini: [1]   În jos
  Imprimă  
Ajutor Subiect: arbore de cautare  (Citit de 1392 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
xxxxxxxxx
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 4



Vezi Profilul
« : Mai 17, 2011, 17:46:18 »

Salut, as vrea va rog sa ma ajutati putin
Am facut totul, doar ca stergerea nu e buna, ce/unde am gresit ?
Problema:
Sa se creeze un arbore binar de cautare care sa contina in cimpul informatie
 urmatoarea structura: nume, prenume, medie, grupa;
 structura arborescenta se realizeaza dupa cimpurile nume si prenume. Se cere sa se
 realizeze cite o functie pentru: INSERAREA unui nod in arbore;
 LISTAREA tuturor studentilor in ordine alfabetica;
 MODIFICAREA datelor unui nod; AFISAREA arborescenta;STERGEREA unui nod.

Cod:
#include<stdio.h>
 #include<conio.h>
 #include<string.h>
 #include<stdlib.h>

 typedef struct
 {
 char nume[15];
 char prenume[15];
 int media;
 int grupa;
 }informatie;

 typedef struct nod
 {
 informatie inf;
 struct nod *st,*dr;
 }t_nod;


 nod *a;

 nod *CREARE(nod *rad)
 {
 if(rad!=NULL)
 {
 printf("\n Arborele este creat");
 return rad;
 }
 else
 {
 rad=new nod;
 printf(" Numele:"); scanf("%s",rad->inf.nume);
 printf(" Prenumele:");
 scanf("%s",rad->inf.prenume);
 printf(" Media:");
 scanf("%d",&rad->inf.media);
 printf(" Grupa:");
 scanf("%d",&rad->inf.grupa);
 rad->st=NULL;
 rad->dr=NULL;
                 printf("\n Arborele a fost creat");
 return rad;
 }              
 }
 nod *INSERARE(nod *rad, char k[15])
 {
 int aux;
 if(rad==NULL)
         {
 rad=new nod;
 strcpy(rad->inf.nume,k);
 printf(" Prenumele:");
 scanf("%s",rad->inf.prenume);
 printf(" Media:");
 scanf("%d",&rad->inf.media);
 printf(" Grupa:");
 scanf("%d",&rad->inf.grupa);
 rad->st=NULL;
 rad->dr=NULL;
 return rad;
 }
 else
         {
 aux=strcmp(rad->inf.nume,k);
 if(aux==0)
 {
 printf("\n Numele acesta exista");
 getch();
 return rad;
 }
 if(aux<0)
 rad->st=INSERARE(rad->st,k);
 else
 rad->dr=INSERARE(rad->dr,k);
 }
 return rad;
 }

 void LIST(nod *rad)
 {
 if(rad)
 {
 LIST(rad->dr);
 {
 printf("\n Numele:%s\n",rad->inf.nume);
 printf(" Prenumele:%s\n",rad->inf.prenume);
 printf(" Media:%d\n",rad->inf.media);
 printf(" Grupa:%d\n",rad->inf.grupa);
 }
 LIST(rad->st);
 }
 }


 void MODIFICARE(nod *rad, char k[15])
 {
 int aux;
 aux=strcmp(rad->inf.nume,k);
 if(aux==0)
 {
         printf(" Prenumele:");
 scanf("%s",rad->inf.prenume);
 printf(" Media:");
 scanf("%d",&rad->inf.media);
 printf(" Grupa:");
 scanf("%d",&rad->inf.grupa);
 }
 else if(aux!=0 && rad->st!=NULL)
 MODIFICARE(rad->st,k);
 else if(aux!=0 && rad->dr!=NULL)
 MODIFICARE(rad->dr,k);
 }

 nod *DEL(nod *p, nod *q, nod *r)
 {
 if(p->dr!=NULL)
 DEL(p->dr,q,r);
 else
 {
 p->dr=r;
 q=q->st;
 }
 return(0);
 }


 void DELETE(nod *rad, char k[15])
 {
 int aux;
 nod *q;
 aux=strcmp(k,rad->inf.nume);
 if(aux<0)
 DELETE(rad->st,k);
 else if(aux>0)
 DELETE(rad->dr,k);
 else
 {
 q=rad;
 if(q->dr==NULL)
 rad=q->st;
 else if(q->st==NULL)
 rad=q->dr;
 else
 DEL(q->st,q,q->dr);
 }
 delete rad;
 }

 void main()
 {
 char ch,litera,k[15];
 do
 {
 clrscr();
 printf("\n 1. Crearea arborelui \n 2. Inserare \n 3. Listare");
 printf("\n 4. Modificare \n 5. Stergere \n 0. Exit \n ");
 ch=getch();
 switch(ch)
 {
 case '1':clrscr();
 a=CREARE(a);
 getch();
 break;
 case '2':clrscr();
 if(a==NULL)
 printf("\n Trebuie sa creati arborele");
 else
 {
 do
   {
   clrscr();
 printf("\n Numele:");scanf("%s",k);
 INSERARE(a,k);
 printf("\n Continuati?");
 litera=getch();
 }                                
 while((litera!='n')&&(litera!='N'));
 }
                                 getch();
 break;
 case '3':clrscr();
 if(a==NULL)
 printf("\n Trebuie sa creati arborele");
   else
   {
                                   clrscr();
 LIST(a);
   }
                                   getch();
   break;
 case '4':clrscr();
 if(a==NULL)
 printf("\n Trebuie sa creati arborele");
 else
 {
 printf("\n Numele:"); scanf("%s",k);
 MODIFICARE(a,k);
                                 }
 getch();
 break;
 case '5':clrscr();
 if(a==NULL)
 printf("\n Trebuie sa creati arborele");
 else
 {
 printf("\n Numele:"); scanf("%s",k);
 DELETE(a,k);
 printf("\n Nodul a fost sters");
                                 }
 getch();
                                 break;
 }
 }
 while(ch!='0');
 }




Acesta e codul la stergere:
nod *DEL(nod *p, nod *q, nod *r)
 {
 if(p->dr!=NULL)
 DEL(p->dr,q,r);
 else
 {
 p->dr=r;
 q=q->st;
 }
 return(0);
 }


 void DELETE(nod *rad, char k[15])
 {
 int aux;
 nod *q;
 aux=strcmp(k,rad->inf.nume);
 if(aux<0)
 DELETE(rad->st,k);
 else if(aux>0)
 DELETE(rad->dr,k);
 else
 {
 q=rad;
 if(q->dr==NULL)
 rad=q->st;
 else if(q->st==NULL)
 rad=q->dr;
 else
 DEL(q->st,q,q->dr);
 }
 delete rad;
 }

Mersis
« Ultima modificare: Mai 17, 2011, 18:31:41 de către Savin Tiberiu » Memorat
toni2007
Nu mai tace
*****

Karma: 160
Deconectat Deconectat

Mesaje: 663



Vezi Profilul
« Răspunde #1 : Mai 17, 2011, 18:56:12 »

Cod:
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>

typedef struct
{
    char nume[15];
    char prenume[15];
    int media;
    int grupa;
} informatie;

typedef struct nod
{
    informatie inf;
    struct nod *st,*dr;
} t_nod;


nod *a;

nod *CREARE(nod *rad)
{
    if(rad!=NULL)
    {
        printf("\n Arborele este creat");
        return rad;
    }
    else
    {
        rad=new nod;
        printf(" Numele:");
        scanf("%s",rad->inf.nume);
        printf(" Prenumele:");
        scanf("%s",rad->inf.prenume);
        printf(" Media:");
        scanf("%d",&rad->inf.media);
        printf(" Grupa:");
        scanf("%d",&rad->inf.grupa);
        rad->st=NULL;
        rad->dr=NULL;
        printf("\n Arborele a fost creat");
        return rad;
    }
}
nod *INSERARE(nod *rad, char k[15])
{
    int aux;
    if(rad==NULL)
    {
        rad=new nod;
        strcpy(rad->inf.nume,k);
        printf(" Prenumele:");
        scanf("%s",rad->inf.prenume);
        printf(" Media:");
        scanf("%d",&rad->inf.media);
        printf(" Grupa:");
        scanf("%d",&rad->inf.grupa);
        rad->st=NULL;
        rad->dr=NULL;
        return rad;
    }
    else
    {
        aux=strcmp(rad->inf.nume,k);
        if(aux==0)
        {
            printf("\n Numele acesta exista");
            getch();
            return rad;
        }
        if(aux<0)
            rad->st=INSERARE(rad->st,k);
        else
            rad->dr=INSERARE(rad->dr,k);
    }
    return rad;
}

void LIST(nod *rad)
{
    if(rad)
    {
        LIST(rad->dr);
        {
            printf("\n Numele:%s\n",rad->inf.nume);
            printf(" Prenumele:%s\n",rad->inf.prenume);
            printf(" Media:%d\n",rad->inf.media);
            printf(" Grupa:%d\n",rad->inf.grupa);
        }
        LIST(rad->st);
    }
}


void MODIFICARE(nod *rad, char k[15])
{
    int aux;
    aux=strcmp(rad->inf.nume,k);
    if(aux==0)
    {
        printf(" Prenumele:");
        scanf("%s",rad->inf.prenume);
        printf(" Media:");
        scanf("%d",&rad->inf.media);
        printf(" Grupa:");
        scanf("%d",&rad->inf.grupa);
    }
    else if(aux!=0 && rad->st!=NULL)
        MODIFICARE(rad->st,k);
    else if(aux!=0 && rad->dr!=NULL)
        MODIFICARE(rad->dr,k);
}

nod *DEL(nod *p, nod *q, nod *r)
{
    if(p->dr!=NULL)
        DEL(p->dr,q,r);
    else
    {
        p->dr=r;
        q=q->st;
    }
    return(0);
}


void DELETE(nod *rad, char k[15])
{
    int aux;
    nod *q;
    aux=strcmp(k,rad->inf.nume);
    if(aux<0)
        DELETE(rad->st,k);
    else if(aux>0)
        DELETE(rad->dr,k);
    else
    {
        q=rad;
        if(q->dr==NULL)
            rad=q->st;
        else if(q->st==NULL)
            rad=q->dr;
        else
            DEL(q->st,q,q->dr);
    }
    delete rad;
}

void main()
{
    char ch,litera,k[15];
    do
    {
        clrscr();
        printf("\n 1. Crearea arborelui \n 2. Inserare \n 3. Listare");
        printf("\n 4. Modificare \n 5. Stergere \n 0. Exit \n ");
        ch=getch();
        switch(ch)
        {
        case '1':
            clrscr();
            a=CREARE(a);
            getch();
            break;
        case '2':
            clrscr();
            if(a==NULL)
                printf("\n Trebuie sa creati arborele");
            else
            {
                do
                {
                    clrscr();
                    printf("\n Numele:");
                    scanf("%s",k);
                    INSERARE(a,k);
                    printf("\n Continuati?");
                    litera=getch();
                }
                while((litera!='n')&&(litera!='N'));
            }
            getch();
            break;
        case '3':
            clrscr();
            if(a==NULL)
                printf("\n Trebuie sa creati arborele");
            else
            {
                clrscr();
                LIST(a);
            }
            getch();
            break;
        case '4':
            clrscr();
            if(a==NULL)
                printf("\n Trebuie sa creati arborele");
            else
            {
                printf("\n Numele:");
                scanf("%s",k);
                MODIFICARE(a,k);
            }
            getch();
            break;
        case '5':
            clrscr();
            if(a==NULL)
                printf("\n Trebuie sa creati arborele");
            else
            {
                printf("\n Numele:");
                scanf("%s",k);
                DELETE(a,k);
                printf("\n Nodul a fost sters");
            }
            getch();
            break;
        }
    }
    while(ch!='0');
}




Acesta e codul la stergere:
nod *DEL(nod *p, nod *q, nod *r)
{
    if(p->dr!=NULL)
        DEL(p->dr,q,r);
    else
    {
        p->dr=r;
        q=q->st;
    }
    return(0);
}


void DELETE(nod *rad, char k[15])
{
    int aux;
    nod *q;
    aux=strcmp(k,rad->inf.nume);
    if(aux<0)
        DELETE(rad->st,k);
    else if(aux>0)
        DELETE(rad->dr,k);
    else
    {
        q=rad;
        if(q->dr==NULL)
            rad=q->st;
        else if(q->st==NULL)
            rad=q->dr;
        else
            DEL(q->st,q,q->dr);
    }
    delete rad;
}

Posteaza si tu formatat frumos, altfel nu cred ca o sa te ajute nimeni Tongue.
Memorat
xxxxxxxxx
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 4



Vezi Profilul
« Răspunde #2 : Mai 17, 2011, 19:13:20 »

deci aceasta e rezolvarea mea:
Cod:
#include<stdio.h>
 #include<conio.h>
 #include<string.h>
 #include<stdlib.h>

 typedef struct
 {
 char nume[15];
 char prenume[15];
 int media;
 int grupa;
 }informatie;

 typedef struct nod
 {
 informatie inf;
 struct nod *st,*dr;
 }t_nod;


 nod *a;

 nod *CREARE(nod *rad)
 {
 if(rad!=NULL)
 {
 printf("\n Arborele este creat");
 return rad;
 }
 else
 {
 rad=new nod;
 printf(" Numele:"); scanf("%s",rad->inf.nume);
 printf(" Prenumele:");
 scanf("%s",rad->inf.prenume);
 printf(" Media:");
 scanf("%d",&rad->inf.media);
 printf(" Grupa:");
 scanf("%d",&rad->inf.grupa);
 rad->st=NULL;
 rad->dr=NULL;
                 printf("\n Arborele a fost creat");
 return rad;
 }             
 }
 nod *INSERARE(nod *rad, char k[15])
 {
 int aux;
 if(rad==NULL)
         {
 rad=new nod;
 strcpy(rad->inf.nume,k);
 printf(" Prenumele:");
 scanf("%s",rad->inf.prenume);
 printf(" Media:");
 scanf("%d",&rad->inf.media);
 printf(" Grupa:");
 scanf("%d",&rad->inf.grupa);
 rad->st=NULL;
 rad->dr=NULL;
 return rad;
 }
 else
         {
 aux=strcmp(rad->inf.nume,k);
 if(aux==0)
 {
 printf("\n Numele acesta exista");
 getch();
 return rad;
 }
 if(aux<0)
 rad->st=INSERARE(rad->st,k);
 else
 rad->dr=INSERARE(rad->dr,k);
 }
 return rad;
 }

 void LIST(nod *rad)
 {
 if(rad)
 {
 LIST(rad->dr);
 {
 printf("\n Numele:%s\n",rad->inf.nume);
 printf(" Prenumele:%s\n",rad->inf.prenume);
 printf(" Media:%d\n",rad->inf.media);
 printf(" Grupa:%d\n",rad->inf.grupa);
 }
 LIST(rad->st);
 }
 }


 void MODIFICARE(nod *rad, char k[15])
 {
 int aux;
 aux=strcmp(rad->inf.nume,k);
 if(aux==0)
 {
         printf(" Prenumele:");
 scanf("%s",rad->inf.prenume);
 printf(" Media:");
 scanf("%d",&rad->inf.media);
 printf(" Grupa:");
 scanf("%d",&rad->inf.grupa);
 }
 else if(aux!=0 && rad->st!=NULL)
 MODIFICARE(rad->st,k);
 else if(aux!=0 && rad->dr!=NULL)
 MODIFICARE(rad->dr,k);
 }

 nod *DEL(nod *p, nod *q, nod *r)
 {
 if(p->dr!=NULL)
 DEL(p->dr,q,r);
 else
 {
 p->dr=r;
 q=q->st;
 }
 return(0);
 }


 void DELETE(nod *rad, char k[15])
 {
 int aux;
 nod *q;
 aux=strcmp(k,rad->inf.nume);
 if(aux<0)
 DELETE(rad->st,k);
 else if(aux>0)
 DELETE(rad->dr,k);
 else
 {
 q=rad;
 if(q->dr==NULL)
 rad=q->st;
 else if(q->st==NULL)
 rad=q->dr;
 else
 DEL(q->st,q,q->dr);
 }
 delete rad;
 }

 void main()
 {
 char ch,litera,k[15];
 do
 {
 clrscr();
 printf("\n 1. Crearea arborelui \n 2. Inserare \n 3. Listare");
 printf("\n 4. Modificare \n 5. Stergere \n 0. Exit \n ");
 ch=getch();
 switch(ch)
 {
 case '1':clrscr();
 a=CREARE(a);
 getch();
 break;
 case '2':clrscr();
 if(a==NULL)
 printf("\n Trebuie sa creati arborele");
 else
 {
 do
   {
   clrscr();
 printf("\n Numele:");scanf("%s",k);
 INSERARE(a,k);
 printf("\n Continuati?");
 litera=getch();
 }                               
 while((litera!='n')&&(litera!='N'));
 }
                                 getch();
 break;
 case '3':clrscr();
 if(a==NULL)
 printf("\n Trebuie sa creati arborele");
   else
   {
                                   clrscr();
 LIST(a);
   }
                                   getch();
   break;
 case '4':clrscr();
 if(a==NULL)
 printf("\n Trebuie sa creati arborele");
 else
 {
 printf("\n Numele:"); scanf("%s",k);
 MODIFICARE(a,k);
                                 }
 getch();
 break;
 case '5':clrscr();
 if(a==NULL)
 printf("\n Trebuie sa creati arborele");
 else
 {
 printf("\n Numele:"); scanf("%s",k);
 DELETE(a,k);
 printf("\n Nodul a fost sters");
                                 }
 getch();
                                 break;
 }
 }
 while(ch!='0');
 }

Iar aici e codul de la stergere:
Cod:
nod *DEL(nod *p, nod *q, nod *r)
 {
 if(p->dr!=NULL)
 DEL(p->dr,q,r);
 else
 {
 p->dr=r;
 q=q->st;
 }
 return(0);
 }


 void DELETE(nod *rad, char k[15])
 {
 int aux;
 nod *q;
 aux=strcmp(k,rad->inf.nume);
 if(aux<0)
 DELETE(rad->st,k);
 else if(aux>0)
 DELETE(rad->dr,k);
 else
 {
 q=rad;
 if(q->dr==NULL)
 rad=q->st;
 else if(q->st==NULL)
 rad=q->dr;
 else
 DEL(q->st,q,q->dr);
 }
 delete rad;
 }
Memorat
Mishu91
Nu mai tace
*****

Karma: 169
Deconectat Deconectat

Mesaje: 751



Vezi Profilul
« Răspunde #3 : Mai 17, 2011, 20:17:46 »

Cred că ar fi mult mai bine (mai ales pentru tine) să explici în cuvinte ce nu îţi iese, eventual să dai ceva detalii de la debug. Aşa dacă trânteşti nişte cod formatat aşa încât doar tu să-l poţi înţelege, şansele să vină cineva şi să facă debug in locul tău sunt mici.
Memorat
xxxxxxxxx
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 4



Vezi Profilul
« Răspunde #4 : Mai 17, 2011, 20:56:16 »

deci rezolvarea facuta de mine se compileaza, nu primesc errori.
merge inserarea, listarea, modificarea, doar ca atunci cand dau la stergere (se face dupa NUME), scriu numele care vreau sa-l sterg, primesc mesajul ”Nodul a fost sters”, iar cand  verific la listare, nu e sters nimic.
Memorat
Pagini: [1]   În sus
  Imprimă  
 
Schimbă forumul:  

Powered by SMF 1.1.19 | SMF © 2006-2013, Simple Machines