Afişează mesaje
Pagini: [1]
1  infoarena - concursuri, probleme, evaluator, articole / Informatica / lista dublu inlantuita : Mai 25, 2011, 11:13:24
salut,
am facut o problema in C cu lista simplu inlantuita,
doar ca eu ar fi trebuit sa o fac dublu inlantuita, si as vrea sa aflu ce ar trebui sa modific.

mersi mult.
2  infoarena - concursuri, probleme, evaluator, articole / Informatica / Răspuns: arbore de cautare : 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.
3  infoarena - concursuri, probleme, evaluator, articole / Informatica / Răspuns: arbore de cautare : 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;
 }
4  infoarena - concursuri, probleme, evaluator, articole / Informatica / arbore de cautare : 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
Pagini: [1]
Powered by SMF 1.1.19 | SMF © 2006-2013, Simple Machines