Sunteți pe pagina 1din 17

Algoritmi si structuri de date

Informatica An -I- ID

Probleme rezolvate
Problema 1. Fiierul Numere.txt conine pe fiecare rnd cte un numar ntreg. Sa se creeze si apoi sa se tipareasca o lista simplu inlanuita n care se vor introduce numai valorile pare din fiierul dat. #include <fstream.h> struct nod { int info; nod *urm; }; fstream f("numere.txt",ios::in); int n; nod *p,*u,*q,*q1; void afisare(nod *p) { q=p; while(q!=NULL) { cout<<q->info<<" "; q=q->urm; } cout<<endl; } void main() { f>>n; while((n%2!=0)&&(f.eof())) f>>n; if(n%2==0) { p=new nod; p->info=n; p->urm=NULL; u=p; } while(f>>n) { if (n%2==0) {
-1-

Algoritmi si structuri de date

Informatica An -I- ID

q=new nod; q->info=n; q->urm=NULL; u->urm=q; u=q; } } cout<<"Lista "; if (p!=NULL) afisare(p); else cout<<"vida"; f.close(); } Problema 2 Se citesc de la tastatura un numar intreg cu maxim opt cifre. Sa se afiseze oglinditul numaralului folosind o lista liniara simplu inlantuita in nodurile careia se memoreaza cifrele. #include <iostream.h> struct nod { int c; nod *urm; }; nod *p,*u,*q; long int n,o; void main() { cout<<"n=";cin>>n; p=new nod; p->c=n%10; n=n/10; p->urm=NULL; u=p; while(n!=0) { q=new nod; q->c=n%10; n=n/10; q->urm=NULL; u->urm=q; u=q; } o=0; q=p; while(q!=NULL)
-2-

Algoritmi si structuri de date

Informatica An -I- ID

{ o=o*10+q->c; q=q->urm; }; cout<<"Oglinditul este "<<o; } Problema 3 Sa se scrie un program care verifica daca doua liste liniare simplu inlantuite sunt identice sau nu. #include<iostream.h> struct nod { int nr; nod *urm; }; nod *p1,*p2,*q1,*q2,*u1,*u2,*q,*p; int n,m,i,j,el; void afisare(nod *p) { q=p; while(q!=NULL) { cout<<q->nr<<" "; q=q->urm; } cout<<endl; } void main() { cout<<"Numarul de elemente lista 1 "; cin>>n; cout<<"Numar "; cin>>el; p1=new nod; p1->nr=el; p1->urm=NULL; u1=p1; for(i=2;i<=n;i++) { cout<<"Numar "; cin>>el; q1=new nod; q1->nr=el; q1->urm=NULL; u1->urm=q1; u1=q1; }
-3-

Algoritmi si structuri de date

Informatica An -I- ID

cout<<"Numarul de elemente lista 2 "; cin>>m; cout<<"Numar "; cin>>el; p2=new nod; p2->nr=el; p2->urm=NULL; u2=p2; for(i=2;i<=m;i++) { cout<<"Numar "; cin>>el; q2=new nod; q2->nr=el; q2->urm=NULL; u2->urm=q2; u2=q2; } if(n!=m) cout<<"Listele sunt diferite"; else { j=0; q1=p1; q2=p2; while(q1!=NULL) { if(q1->nr!=q2->nr) j=1; q1=q1->urm; q2=q2->urm; } cout<<"Lista 1"<<" "; afisare(p1); cout<<"Lista 2"<<" "; afisare(p2); if(j==0) cout<<"sunt identice"; else cout<<"nu sunt identice"; } } Problema 4 Se da o lista liniara simplu inlantuita. Sa se scrie un program care elimina elementele de pe pozitiile numere prime. #include <iostream.h> struct nod { int nr; nod *urm;
-4-

Algoritmi si structuri de date

Informatica An -I- ID

}; nod *p,*q,*u,*q1; int n,i; void afisare(nod *p) { nod *q; q=p; while(q!=NULL) { cout<<q->nr<<" "; q=q->urm; } cout<<endl; } int prim(int x) { int p=0,d; for(d=2;d<=x/2;d++) if(x%d==0) p=1; return p; } void main() { cout<<"Dati 0 pentru sfarsit"<<endl; cout<<"Numar="; cin>>n; while (n!=0) { if(i==0) { p=new nod; p->nr=n; p->urm=NULL; u=p; i=1; } else { q=new nod; q->nr=n; q->urm=NULL; u->urm=q; u=q; } cout<<"Numar="; cin>>n; }
-5-

Algoritmi si structuri de date

Informatica An -I- ID

cout<<"Lista initiala "; afisare(p); i=1; q=p; while(q!=NULL) { while(prim(i+1)==0) { q1=q->urm; q->urm=q->urm->urm; delete q1; i++; } i++; q=q->urm; } cout<<"Lista noua "; afisare(p); } Problema 5 Se da o lista liniara simplu inlantuita. Sa se scrie un program care returneaza minimul din cheile (elementele) din lista. #include <fstream.h> struct nod { int info; nod *urm; }; fstream f("fis.txt",ios::in); int n,d,min; nod *p,*u,*q,*q1; void afisare(nod *p) { q=p; while(q!=NULL) { cout<<q->info<<" "; q=q->urm; } cout<<endl; } void main() { f>>n;
-6-

Algoritmi si structuri de date

Informatica An -I- ID

p=new nod; p->info=n; p->urm=NULL; u=p; while(f>>n) { q=new nod; q->info=n; q->urm=NULL; u->urm=q; u=q; } cout<<"Lista initiala "; afisare(p); min=p->info; q=p->urm; while(q) { if(min>q->info) min=q->info; q=q->urm; }; cout<<endl<<"Minimul din lista="<<min; f.close(); } Problema 6 Se da o lista liniara simplu inlantuita. Sa se scrie un program care afiseaza cheile pozitive din nodurile cu numar de ordine impar. #include <fstream.h> struct nod { int info; nod *urm; }; fstream f("fis.txt",ios::in); int n,nre=0,s=0; nod *p,*u,*q,*q1; void afisare(nod *p) { q=p; while(q!=NULL) { cout<<q->info<<" "; q=q->urm;
-7-

Algoritmi si structuri de date

Informatica An -I- ID

} cout<<endl; } void main() { f>>n; p=new nod; p->info=n; p->urm=NULL; u=p; while(f>>n) { q=new nod; q->info=n; q->urm=NULL; u->urm=q; u=q; } cout<<"Lista initiala "; afisare(p); q=p; while(q) { nre++; if ((nre%2!=0) && (q->info>0)) cout<<q->info<<" "; q=q->urm; }; f.close(); } Problema 7 Se da o lista liniara simplu inlantuita. Sa se scrie un program care afiseaza numarul cheilor negative, nule si pozitive din lista. #include <fstream.h> struct nod { int info; nod *urm; }; fstream f("fis.txt",ios::in); int n,d,nrn=0,nrnu=0,nrpo=0; nod *p,*u,*q,*q1; void afisare(nod *p)
-8-

Algoritmi si structuri de date

Informatica An -I- ID

{ q=p; while(q!=NULL) { cout<<q->info<<" "; q=q->urm; } cout<<endl; } void main() { f>>n; p=new nod; p->info=n; p->urm=NULL; u=p; while(f>>n) { q=new nod; q->info=n; q->urm=NULL; u->urm=q; u=q; } cout<<"Lista initiala "; afisare(p); q=p; while(q) { if(q->info<0)nrn++; if(q->info==0)nrnu++; if(q->info>0)nrpo++; q=q->urm; }; cout<<endl; if(nrn!=0) cout<<"Numar de elemente negative="<<nrn<<endl; else cout<<"Lista nu are elemente negative"<<endl; if(nrnu!=0) cout<<"Numar de elemente nule="<<nrnu<<endl; else cout<<"Lista nu are elemente nule"<<endl; if(nrpo!=0) cout<<"Numar de elemente pozitive="<<nrpo<<endl; else cout<<"Lista nu are elemente pozitive"<<endl; f.close(); } Problema 8

-9-

Algoritmi si structuri de date

Informatica An -I- ID

Se da o lista liniara simplu inlantuita. Sa se scrie un program care returneaza numarul de noduri ale listei. #include <fstream.h> struct nod { int info; nod *urm; }; fstream f("fis.txt",ios::in); int n,nre=0; nod *p,*u,*q,*q1; void afisare(nod *p) { q=p; while(q!=NULL) { cout<<q->info<<" "; q=q->urm; } cout<<endl; } void main() { f>>n; p=new nod; p->info=n; p->urm=NULL; u=p; while(f>>n) { q=new nod; q->info=n; q->urm=NULL; u->urm=q; u=q; } cout<<"Lista initiala "; afisare(p); q=p; while(q) { nre++; q=q->urm; }; cout<<endl; if(nre==0) cout<<"Lista vida"<<endl;
- 10 -

Algoritmi si structuri de date

Informatica An -I- ID

else cout<<"Lista are "<<nre<<" elemente"<<endl; f.close(); }

Problema 9 Se da o lista liniara simplu inlantuita. Sa se scrie un program care testeaza daca cheile listei sunt in ordine descrescatoare. #include <fstream.h> struct nod { int info; nod *urm; }; fstream f("fis.txt",ios::in); int n,d; nod *p,*u,*q,*q1; void afisare(nod *p) { q=p; while(q!=NULL) { cout<<q->info<<" "; q=q->urm; } cout<<endl; } void main() { f>>n; p=new nod; p->info=n; p->urm=NULL; u=p; while(f>>n) { q=new nod; q->info=n; q->urm=NULL; u->urm=q; u=q; }
- 11 -

Algoritmi si structuri de date

Informatica An -I- ID

cout<<"Lista initiala "; afisare(p); d=0; q=p; while(q) { if(q->info<0)nrn++; if(q->info==0)nrnu++; if(q->info>0)nrpo++; q=q->urm; }; cout<<endl; if(nrn!=0) cout<<"Numar de elemente negative="<<nrn<<endl; else cout<<"Lista nu are elemente negative"<<endl; if(nrnu!=0) cout<<"Numar de elemente nule="<<nrnu<<endl; else cout<<"Lista nu are elemente nule"<<endl; if(nrpo!=0) cout<<"Numar de elemente pozitive="<<nrpo<<endl; else cout<<"Lista nu are elemente pozitive"<<endl; f.close(); } Problema 10 Se da o lista liniara simplu inlantuita. Sa se scrie un program care returneaza media aritmetica a numerelor din lista. #include <fstream.h> struct nod { int info; nod *urm; }; fstream f("fis.txt",ios::in); int n,nre=0,s=0; nod *p,*u,*q,*q1; void afisare(nod *p) { q=p; while(q!=NULL) { cout<<q->info<<" "; q=q->urm; } cout<<endl; } void main()
- 12 -

Algoritmi si structuri de date

Informatica An -I- ID

{ f>>n; p=new nod; p->info=n; p->urm=NULL; u=p; while(f>>n) { q=new nod; q->info=n; q->urm=NULL; u->urm=q; u=q; } cout<<"Lista initiala "; afisare(p); q=p; while(q) { nre++; s=s+q->info; q=q->urm; }; cout<<endl; if(nre==0) cout<<"Lista vida"<<endl; else cout<<"Media aritmetica "<<(float)s/nre<<endl; f.close(); } Problema 11 Se da o lista liniara simplu inlantuita. Sa se scrie un program care afiseaza numarul de aparitii ale unei valori date X in lista. Daca valoarea X nu exista in lista,se va tiparii un mesaj. #include <iostream.h> struct nod { int nr; nod *urm; }; nod *p,*u,*q; int i,n,x,ap=0; void main() { cout<<"Numar de elemente din lista="; cin>>n;
- 13 -

Algoritmi si structuri de date

Informatica An -I- ID

p=new nod; cout<<"Numar="; cin>>p->nr; p->urm=NULL; u=p; for(i=2;i<=n;i++) { q=new nod; cout<<"Numar="; cin>>q->nr; q->urm=NULL; u->urm=q; u=q; } cout<<"Valoarea cautata="; cin>>x; q=p; while(q!=NULL) { if(q->nr==x) ap++; q=q->urm; }; if(ap==0) cout<<"Valoarea cautata nu exista"; else cout<<x<<" apare de "<<ap<<" ori"; } Problema 12 Se se scrie un program care elimina unul sau doua (daca lista contine un numar par de noduri) elementele din mijlocul unei liste liniare simplu inlantuite. #include <iostream.h> struct nod { int nr; nod *urm; }; nod *p,*q,*u; int n,i=0; void afisare(nod *p) { nod *q; q=p; while(q!=NULL) { cout<<q->nr<<" ";
- 14 -

Algoritmi si structuri de date

Informatica An -I- ID

q=q->urm; } cout<<endl; } int nrel(nod *p) { int nre=0; nod *q; q=p; while(q!=NULL) { nre++; q=q->urm; }; return nre; } void main() { cout<<"Dati 0 pentru sfarsit"<<endl; cout<<"Numar="; cin>>n; while (n!=0) { if(i==0) { p=new nod; p->nr=n; p->urm=NULL; u=p; i=1; } else { q=new nod; q->nr=n; q->urm=NULL; u->urm=q; u=q; } cout<<"Numar="; cin>>n; } cout<<"Lista initiala "; afisare(p); if(nrel(p)%2==0) { q=p; for(int i=1;i<=nrel(p)/2-2;i++)
- 15 -

Algoritmi si structuri de date

Informatica An -I- ID

q=q->urm; q->urm=q->urm->urm->urm; } else { q=p; for(int i=1;i<=nrel(p)/2-1;i++) q=q->urm; q->urm=q->urm->urm; } cout<<"Lista noua "; afisare(p); } Problema 13 Sa se scrie un program care creeaza o lista dublu inlantuita cu numere reale. Sa se insereze apoi intre oricare noduri ale listei un nod nou continand ca informatie media aritmetica din cele doua noduri. #include <iostream.h> struct nod { float nr; nod *urm,*ant; }; nod *p,*u,*q,*q1;; int i,n; void afisare(nod *p) { nod *q; q=p; while(q!=NULL) { cout<<q->nr<<" "; q=q->urm; } } void main() { cout<<"Numar de elemente din lista="; cin>>n; p=new nod; cout<<"Numar="; cin>>p->nr; p->urm=NULL; p->ant=NULL;
- 16 -

Algoritmi si structuri de date

Informatica An -I- ID

u=p; for(i=2;i<=n;i++) { q=new nod; cout<<"Numar="; cin>>q->nr; q->urm=NULL; q->ant=u; u->urm=q; u=q; } cout<<"Lista initiala"; afisare(p); cout<<endl; q=p; while(q->urm!=NULL) { q1=new nod; q1->nr=(float)(q->nr+q->urm->nr)/2; q1->urm=q->urm; q->urm->ant=q1; q1->ant=q->urm->ant; q->urm=q1; q=q1->urm; }; cout<<"Lista obtinuta "; afisare(p); }

- 17 -