Documente Academic
Documente Profesional
Documente Cultură
Laborator 1
1. C.m.m.d.c.
Acest algoritm este mult mai eficient decât algoritmul lui Euclid. El urmăreşte
următoarele proprietăţi:
- dacă a şi b sunt ambele pare, atunci cmmdc(a,b)=2*cmmdc(a/2, b/2)
- dacă a este par şi b este impar, atunci cmmdc(a,b)=cmmdc(a/2, b)
- dacă a şi b sunt impare, atunci cmmdc(a,b)=cmmdc(|a-b|/2,b)
int cmmdcStein(int a, int b)
{
int g=1,t;
while ((a%2==0)&&(b%2==0))
{ a=a/2;
b=b/2;
g=2*g;
}
while(a>0)
{ while ((a%2==0)||(b%2==0))
{ if (a%2==0) a=a/2;
else b=b/2;
}
t=abs(a-b)/2;
if (a<b) b=t;
else a=t;
}
return g*b;
}
Structuri de date 2
2. Calculul lui xn
Deşi calculul lui xn poate părea o problemă banală, există totuşi un algoritm
care realizează aceasta cu un număr de paşi mai mic decât n. Mai jos sunt prezentaţi
trei algoritmi care calculează xn.
Primul algoritm este algoritmul clasic care calculează x n în n paşi.
3. Metode numerice
b) Metoda coardei
Această metodă alege pe m la intersecţia dintre abscisă şi segmentul dat de
punctele ((a,f(a)), (b,f(b))).
c) Metoda tangentei
Această metodă alege pe m în punctul în care tangenta la funcţie în punctul f(a)
sau f(b) intersectează abscisa.
Laborator 2
1. Recurenţe liniare
a) Recurenţe liniare de ordinul I
Să se rezolve următoarea recurenţe:
T(1)=8 şi T(n)=3T(n-1)-15, n>1
Forma generală a acestui tip de recurenţă este următoarea:
T(n)=aT(n-1)+b, cu T(1) dat.
În continuare vom ataşa acestei recurenţe următoarea ecuaţie caracteristică şi vom
căuta constanta reală s astfel încât:
T(n)+s=a(T(n-1)+s), n N
T(n) = aT(n -1) + s(a -1) b
S(a −1) = b s= , a 1
b = T(n) - aT(n -1) a −1
Caz 2: y1 = y2
Formula termenului general este:
T(n)=(A+nB)y1n O(y1n)
A şi B se identifică din sistemul:
A = T (0)
Ay1 + By1 = T (1)
Cea mai cunoscută recurenţă liniară de ordinul II este şirul lui Fibonacci.
T(n)=T(n-1)+T(n+2), cu T(0)=0 şi T(1)=1.
Ecuaţia caracteristică ataşată este:
y2=y+1
1− 5
y1 =
2
de unde obţinem soluţiile
y = 1+ 5
2 2
5
A=− n n
A + B = 0 5 − 5 1− 5 5 1+ 5
T(n)= +
Ay1 + By 2 = 1 5 5 2 5 2
B = 5
Structuri de date 3
2. Să se demonstreze că următoarele funcţii sunt corect definite, adică se
termină într-un număr finit de paşi
x
2 , x - par
a) F ( x) = F ( F ( x + 3)), x = 4k + 1
F ( F ( x + 1)), x = 4k + 3
2k + 1 −1
Pp. x=2k+1 F ( x) = 2F + 1 = 2 F (k ) + 1 - impar () x N
2
2k
Pp. x=2k F ( x) = 2F F = 2 F ( F (k ))
- par () x N
2
Laborator 3
1. Liste statice
Una dintre cele mai simple şi mai răspândite obiecte de dată sunt listele
ordonte.
Există un set de operaţii care pot fi efectuate pe liste şi anume:
- determinarea lungimii n a unei liste;
- parcurgerea listei de la stânga la dreapta şi de la dreapta la stânga;
- determinarea elementului de pe poziţia k din listă ( 1 k n )
- modificarea valorii elementului de pe poziţia k din listă ( 1 k n )
- inserarea unui nou elemnt pe poziţia i (1 i n ), cauzând o translatare a
elementelor de pe pozţia i, i+1, …, n pe poziţiile i+1, i+2, …, n+1;
- ştergerea elementului de pe poziţia i ( 1 i n ), cauzând o translatare a
elementelor de pe pozţia i+1, …, n pe poziţiile i, i+1, …, n-1;
- interclasarea elementelor a două liste sortate şi construirea unei noi liste.
În cele ce urmează vom construi o clasă ce va implementa operaţiile pe o listă
statică. Vom folosi trei fişiere, unul pentru definirea clasei, unul pentru
implementarea metodelor din clasă şi un al treilea pentru exemplificarea lucrului cu
metodele din clasa SList.
SList.h
class SList{
int count;
int data[20];
public:
SList(); //constructor
int SListLength(); //returneaza lungimea listei
int SListGetElement(int index); //returneaza elementul de pe pozitia index
void SListIterate(); //afiseaza elementele listei statice
void SListModify(int index, int value); //modif. elem. de pe poz. index cu value
void SListInsert(int index, int value); //insereaza elem. value pe poz. index
void SListDelete(int index); //sterge elementul de pe pozitia index
void SListMerge(SList obSList1, SList obSList2); //interclas. doua liste ord.
}; //sfarsitul clasei SList
SList.cpp
#include<stdio.h>
#include<conio.h>
#include "SList.h"
inline SList::SList()
{ count=0;
}
Structuri de date 2
void SList::SListIterate()
{
for(int i=0; i<count;i++)
printf("%d ",data[i]);
}
ExSlist.cpp
#include<stdio.h>
#include<conio.h>
#include "SList.cpp"
void main()
{
int poz, val;
SList ob1, ob2, ob3;
int a;
printf("Introduceti elementele primei liste. Terminati cu 0");
scanf("%d", &a);
while(a!=0)
{
poz=ob1.SListLength();
ob1.SListInsert(poz,a);
scanf("%d", &a);
}
printf("Elementele primei liste sunt:\n");
ob1.SListIterate();
printf("\n Introduceti pozitia de pe care doriti sa aflati
elementul ");
scanf("%d",&poz);
printf("%d",ob1.SListGetElement(poz));
printf("\n Introduceti pozitia pe care doriti sa modificati
elementul \n");
scanf("%d", &poz);
printf("\n Introduceti noua valoare\n");
scanf("%d",&val);
ob1.SListModify(poz,val);
printf("\n Elementele listei sunt:\n");
ob1.SListIterate();
printf("\n Introduceti pozitia de pe care doriti sa stergeti un
element \n");
scanf("%d", &poz);
ob1.SListDelete(poz);
printf("\n Elementele listei sunt:\n");
ob1.SListIterate();
printf("\nIntroduceti elementele ordonate pentru cea de-a doua
lista. Terminati cu 0\n");
scanf("%d", &a);
while(a!=0)
{
poz=ob2.SListLength();
ob2.SListInsert(poz,a);
scanf("%d", &a);
}
printf("\nElementele celei de-a doua liste sunt:\n");
Structuri de date 4
ob2.SListIterate();
printf("\nIntroduceti elementele ordonate pentru cea de-a treia
lista. Terminati cu 0\n");
scanf("%d", &a);
while(a!=0)
{
poz=ob3.SListLength();
ob3.SListInsert(poz,a);
scanf("%d", &a);
}
printf("\nElementele celei de-a doua liste sunt:\n");
ob3.SListIterate();
ob1.SListMerge(ob2,ob3);
printf("\nElementele interclasate sunt:\n");
ob1.SListIterate();
getch();
}
2. Permutări
Perm.h
class perm{
int count;
int data[10];
public:
perm();
void create(int n);
void init();
void permPrint();
perm compose(perm p1, perm p2);
perm permNext(perm p);
};
Structuri de date 5
perm.cpp
#include "perm.h"
#include<stdio.h>
inline perm::perm()
{ count=0;
}
void perm::create(int n)
{ count=n;
for(int i=1;i<=count;i++)
{ printf("\ndata[%d]=",i);
scanf("%d",&data[i]);
}
}
void perm::init()
{ for(int i=1;i<=count;i++)
data[i]=i;
}
void perm::permPrint()
{for(int i=1;i<=count;i++)
printf("%d ",data[i]);
printf("\n");
}
perm perm::permNext(perm p)
{ int i=p.count;
while ((p.data[i]<p.data[i-1])&&(i>1))
i--;
if(i>1)
{ int aux=p.count;
while(p.data[i-1]>p.data[aux])
aux--;
int temp=p.data[i-1];
p.data[i-1]=p.data[aux];
p.data[aux]=temp;
for(int piv=i;piv<=p.count;piv++)
for(int j=piv+1;j<=p.count;j++)
if(p.data[piv]>p.data[j])
{ int te=p.data[piv];
p.data[piv]=p.data[j];
p.data[j]=te;
}
}
count=p.count;
for(i=1;i<=p.count;i++)
Structuri de date 6
data[i]=p.data[i];
return *this;
}
experm.cpp
#include "perm.cpp"
#include<conio.h>
void main()
{
perm p,p1,p2,p3;
int n;
printf("Introdeuceti dimensiunea permutarii:");
scanf("%d",&n);
printf("\n Introduceti prima permutare");
p.create(n);
p.permPrint();
printf("\nIntroduceti a doua permutare");
p2.create(n);
p2.permPrint();
printf("\nCompunerea celor doua permutari:");
p1.compose(p,p2);
p1.permPrint();
printf("Permutarea succesoare:");
p3.permNext(p);
p3.permPrint();
printf("\nPermutarea identica este:");
p.init();
p.permPrint();
getch();
}
Structuri de date 1
Laborator 4
Polinoame
polinom.h
class termen{
public:
int grad;
int coef;
termen(int a, int b);
termen();
};
class polinom{
int count;
termen data[10];
public:
polinom();
polinom ordonare();
polinom atrib(polinom sursa);
polinom adTerm(polinom p,termen t);
polinom scadTerm(polinom p, termen t);
polinom mulCst(int cst);
polinom adPol(polinom p1, polinom p2);
polinom scadPol(polinom p1, polinom p2);
polinom mulPol(polinom p1,polinom p2);
void printPol();
};
Structuri de date 2
Polinom.cpp
#include "polinom.h"
#include<stdio.h>
inline termen::termen()
{ grad=0;
coef=0;
}
inline polinom::polinom()
{ count=0;
}
polinom polinom::ordonare()
{ for(int i=0;i<count-1;i++)
for(int j=i+1;j<count;j++)
if(data[i].grad<data[j].grad)
{termen temp=data[i];
data[i]=data[j];
data[j]=temp;
}
return *this;
}
void polinom::printPol()
{for(int i=0;i<count;i++)
printf("%dX^%d + ",data[i].coef,data[i].grad);
printf("\n");
}
exPolinom.cpp
#include<stdio.h>
#include<conio.h>
#include"polinom.cpp"
Structuri de date 5
void main()
{ polinom p,p1,p2;
termen t;
int cst;
printf("Introduceti termenii primului polinom. Terminati cu coef.0");
printf("\n grad=");scanf("%d",&t.grad);
printf("\n coeficient=");scanf("%d",&t.coef);
while(t.coef!=0)
{p.adTerm(p,t);
printf("\n grad=");scanf("%d",&t.grad);
printf("\n coeficient=");scanf("%d",&t.coef);
}
printf("Polinomul este");
p.printPol();
printf("Introduceti constanta cu care doriti sa inmultiti polinomul:");
scanf("%d",&cst);
p.mulCst(cst);
printf("Polinomul este");
p.printPol();
printf("Introduceti al doilea polinom");
printf("\n grad=");scanf("%d",&t.grad);
printf("\n coeficient=");scanf("%d",&t.coef);
while(t.coef!=0)
{ p1.adTerm(p1,t);
printf("\n grad=");scanf("%d",&t.grad);
printf("\n coeficient=");scanf("%d",&t.coef);
}
printf("\nPolinomul este");
p1.printPol();
p2.adPol(p,p1);
printf("\nPolinomul suma este:");
p2.ordonare();
p2.printPol();
p2.scadPol(p,p1);
printf("\nPolinomul diferenta este:");
p2.ordonare();
p2.printPol();
printf("\nProdusul celor doua polinoame este:");
p2.mulPol(p,p1);
p2.ordonare();
p2.printPol();
getch();
}
Structuri de date 1
Laborator 5
Stiva
stack.h
class stack{
int MaxElem;
int top;
int data[50];
public:
stack();
int IsFull();
int IsEmpty();
void push(int val);
int pop();
void printStack();
};
stack.cpp
#include<stdio.h>
#include "stack.h"
inline stack::stack()
{ top=0;
MaxElem=50;
}
inline int stack::IsFull()
{ if (top==MaxElem)
return 1;
else
return 0;
}
void stack::printStack()
{ if(top>0)
{ for(int i=1;i<=top;i++)
printf("%d ", data[i]);
printf("\n");
}
else
printf("\n Stiva ete goala");
}
ExStack.cpp
#include<stdio.h>
#include<conio.h>
#include "stack.cpp"
void main()
{ stack st;
int val;
printf("\n Introduceti elemente in stiva. Terminati cu 0:");
scanf("%d",&val);
while(val!=0)
{ st.push(val);
scanf("%d",&val);
}
printf("\n Elementele stivei sunt ");
st.printStack();
printf("\n Elementul din varful stivei este:%d", st.pop());
printf("\nAcum stiva este:");
st.printStack();
printf("\n Vom distruge stiva si vom calcula produsul elementelor sale");
int p=1;
while (!st.IsEmpty())
p*=st.pop();
printf("\n Produsul elementelor din stiva este %d",p);
Structuri de date 3
st.printStack();
getch();
}
Coada
Este o listă ordonată în care toate inserările se fac la un capăt, denumit rear şi
toate ştergerile se fac la celălalt capăt denumit front. Deci ea este o structură de tip
FIFO (First In First Out).
În continuare vom defini o clasă queue care se va ocupa cu gestionarea
operaţiilor de pe o coada.
queue.h
class queue{
int MaxElem;
int front;
int rear;
int data[50];
public:
queue();
int IsFull();
int IsEmpty();
void add(int val);
int del();
void printQueue();
};
queue.cpp
#include<stdio.h>
#include "queue.h"
inline queue::queue()
{ front=1;
rear=0;
MaxElem=50;
}
inline int queue::IsFull()
{ if (rear==MaxElem)
return 1;
else
return 0;
}
inline int queue::IsEmpty()
{ if (rear==0)
return 1;
else
return 0;
}
inline void queue::add(int val)
{ if(!IsFull())
{ rear++;
Structuri de date 4
data[rear]=val;
}
else
printf("Error! Coada plina");
}
int queue::del()
{ int temp;
if(!IsEmpty())
{ temp=data[front];
for(int i=1;i<rear;i++)
data[i]=data[i+1];
rear--;
return temp;
}
else printf("Error! Coada goala");
return 0;
}
void queue::printQueue()
{ if(rear>0)
{ for(int i=1;i<=rear;i++)
printf("%d ", data[i]);
printf("\n");
}
else
printf("\n Coada ete goala");
}
exQueue.cpp
#include<stdio.h>
#include<conio.h>
#include "queue.cpp"
void main()
{ queue q;
int val;
printf("\n Introduceti elemente in coada. Terminati cu 0:");
scanf("%d",&val);
while(val!=0)
{ q.add(val);
scanf("%d",&val);
}
printf("\n Elementele cozii sunt ");
q.printQueue();
printf("\n Primul element din coada este:%d", q.del());
printf("\nAcum coada este:");
q.printQueue();
printf("\n Vom distruge coada si vom calcula produsul elementelor sale");
int p=1;
while (!q.IsEmpty())
p*=q.del();
printf("\n Produsul elementelor din coada este %d",p);
q.printQueue();
getch(); }
Structuri de date 5
Matrici rare
Mrara.h
class element{
public:
int lin;
int col;
int val;
element(){
lin=0;
col=0;
val=0;
};
element(int a, int b, int c){
lin=a;
col=b;
val=c;
};
};
class mrara{
int nr_lin;
int nr_col;
int nr_elem;
element data[10];
public:
mrara();
void atribuire(mrara ob);
void adelem(element e);
mrara creare();
void stergere(element e);
void adunare(mrara ob1, mrara ob2);
void mulcst(int cst);
Structuri de date 6
void print();
void mul(mrara ob1, mrara ob2);
};
Mrara.cpp
#include<iostream.h>
#include ”mrara.h”
mrara::mrara()
{
nr_col=0;
nr_lin=0;
nr_elem=0;
}
void mrara::adelem(element e)
{
int ok=1;
for(int i=0;i<nr_elem;i++)
if ((data[i].lin==e.lin)&&(data[i].col==e.col))
{
data[i].val+=e.val;
ok=0;
}
if(ok==1)
{
nr_elem++;
data[nr_elem-1].lin=e.lin;
data[nr_elem-1].col=e.col;
data[nr_elem-1].val=e.val;
}
}
mrara mrara::creare()
{
cout<<"Introduceti nr. de linii:"<<endl;
cin>>nr_lin;
cout<<"Introduceti nr. de coloane"<<endl;
cin>>nr_col;
cout<<"Introdeceti nr. de elemente nenule"<<endl;
cin>>nr_elem;
cout<<"Introduceti elementele"<<endl;
for(int i=0;i<nr_elem;i++)
Structuri de date 7
{ cout<<"elementul "<<i+1<<endl;
cout<<"linie= ";
cin>>data[i].lin;
cout<<"coloana= ";
cin>>data[i].col;
cout<<"valoare= ";
cin>>data[i].val;
cout<<endl;
}
return *this;
}
void mrara::stergere(element e)
{
for(int i=0;i<nr_elem;i++)
if ((data[i].lin==e.lin)&&(data[i].col==e.col)&&(data[i].val==e.val))
{ element temp;
temp=data[i];
data[i]=data[nr_elem-1];
data[nr_elem-1]=temp;
nr_elem--;
}
}
void mrara::print()
{
for(int i=0;i<nr_lin;i++)
{
for(int j=0;j<nr_col;j++)
{ int ok=1;
for(int k=0;k<nr_elem;k++)
if ((data[k].lin==i)&&(data[k].col==j))
{
cout<<data[k].val<<" ";
ok=0;
}
if (ok==1)
cout<<"0 ";
}
Structuri de date 8
cout<<endl;
}
}
exMrara.cpp
#include<iostream.h>
#include”mrara.cpp”
void main()
{
mrara ob1,ob2,ob3;
cout<<"Introduceti prima matrice:"<<endl;
ob1.creare();
ob1.print();
cout<<"Introduceti a doua matrice:"<<endl;
ob2.creare();
ob2.print();
cout<<"Introduceti constanta cu care inmultiti prima matrice"<<endl;
int cst;
cin>>cst;
ob1.mulcst(cst);
Structuri de date 9
ob1.print();
cout<<"Introduceti termenul de scos din a doua matrice"<<endl;
element e;
cout<<"linie=";
cin>>e.lin;
cout<<"coloana=";
cin>>e.col;
cout<<"valoare=";
cin>>e.val;
ob2.stergere(e);
ob2.print();
cout<<"Matricea suma este:"<<endl;
ob3.adunare(ob1,ob2);
ob3.print();
cout<<"Matricea produs este:"<<endl;
ob4.mul(ob1,ob2);
ob4.print();
}
Structuri de Date 1
Laborator 6
Forma poloneză
Evaluarea expresiilor aritmetice folosind stiva
Polish.h
class polish{
double eval;
char* infix;
char* postfix;
int priority(char ch);
int isOperator(char ch);
int operate(int a, int b, char op);
int caracter(char c);
public:
polish(char *ch);
void ReversePolishNotation();
void ReversePolishEvaluate();
};
Polish.cpp
#include<stdio.h>
#include<string.h>
#include<iostream.h>
polish::polish(char *ch)
{
strcat(infix,ch);
}
int polish::isOperator(char c)
{ if(priority(c)>0) return 1;
else return 0;
}
int polish::caracter(char c)
{ int ret;
if (c== '0') ret=0;
if (c== '1') ret=1;
if (c== '2') ret=2;
if (c== '3') ret=3;
if (c== '4') ret=4;
Structuri de Date 3
if (c== '5') ret=5;
if (c== '6') ret=6;
if (c== '7') ret=7;
if (c== '8') ret=8;
if (c== '9') ret=9;
return ret;
}
void polish::ReversePolishNotation()
{ int i;
char *ret;
ret="";
char c;
char st[10];
int top=-1;
i=0;
while(i<strlen(infix))
{ if(!isOperator(*(infix+i)))
ret=ret+(*(infix+i));
else{
while((top>=0)&&(priority(st[top])>=priority(*(infix+i))))
{ c=st[top];
top--;
ret+=c;
}
top++;
st[top]=*(infix+i);
}
i++;
}
while(top>=0)
{ c=st[top];
top--;
ret+=c;
}
postfix=ret;
cout<<ret;
}
void polish::ReversePolishEvaluate()
{ int st[10];
int a,b;
int i,top=-1;
i=0;
Structuri de Date 4
while(i<strlen(postfix))
{ if(isOperator(*(postfix+i)))
{ b=st[top];
top--;
a=st[top];
st[top]=operate(a,b,*(postfix+i));
}
else
{
top++;
st[top]=caracter(*(postfix+i));
}
i++;
}
eval=st[top];
cin>>eval;
}
exPolish.cpp
void main(){
char *sir;
cout<<"Introduceti expresia de evaluat"<<endl;
cin>>sir;
polish p(sir);
p.ReversePolishNotation();
p.ReversePolishEvaluate();
}
Structuri de Date 1
Laborator 7
class ListElement{
public:
int info;
ListElement *next;
// ListElement(int const& _info, ListElement *_next) info(_info), next(_next){}
};
class LinkedList{
ListElement *prim, *ultim;
public:
LinkedList();
~LinkedList();
void Distrugere();
void Creare();
void Afisare();
void StergereVal(int val);
void StergereIndex(int index);
void InsertInceput(int val);
void InsertSf(int val);
void InsertBefore(int infoNod, int val);
void InsertAfter(int infoNod, int val);
void InsertIndex(int index, int val);
void Modifica(int oldVal, int newVal);
int Gasit(int val);
int GetFirst();
int GetLast();
Structuri de Date 2
int& operator[](int index);
void operator=(LinkedList &ls);
int operator==(LinkedList &ls);
friend ostream& operator<<(ostream &stream, LinkedList ls);
friend istream& operator>>(istream &stream, LinkedList &ls);
};
Dlist.cpp
LinkedList::LinkedList(): prim(0),ultim(0) {};
LinkedList::~LinkedList()
{ Distrugere();
}
void LinkedList::Distrugere()
{ while (prim!=NULL)
{ ListElement *temp=prim;
prim=prim->next;
delete temp;
}
prim=NULL; ultim=NULL;
}
void LinkedList::Creare()
{ int n, x;
Distrugere();
prim=NULL; ultim=NULL;
cout<<"cate elemente are lista?"; cin>>n;
cout<<"dati valorile ";
for (int i=1;i<=n;i++) { cin>>x;
InsertSf(x);
}
}
void LinkedList::Afisare()
{ ListElement *p=prim;
if (p==NULL)
{ cout<<"Lista goala"<<endl;
return;
}
while (p)
{ cout<<p->info<<" ";
p=p->next;
}
cout<<endl;
}
int LinkedList::GetFirst()
{ if (prim==NULL) { cout<<"lista goala";
exit(1);
}
return prim->info;
}
int LinkedList::GetLast()
{ if (ultim==NULL) { cout<<"Lista goala!"<<endl;
exit(1);
}
return ultim->info;
}
void meniu()
{
cout<<"1.Creare 8.Stergere valoare"<<endl;
cout<<"2.Afisare 9.Stergere de pe o anumita pozitie"<<endl;
cout<<"3.Inserare inceput 10.Modificare"<<endl;
cout<<"4.Inserare sfarsit 11.Cautare"<<endl;
cout<<"5.Inserare inaintea unui nod 12.Distugere"<<endl;
cout<<"6.Inserare dupa un nod 13.Verificarea egalitatii cu o alta lista"<<endl;
cout<<"7.Inserare pe o anumita pozitie 14.Terminare. "<<endl;
}
Structuri de Date 8
void main()
{ LinkedList l;
int nr;
int val, infoNod, index, oldVal;
meniu();
cout<<"Optiunea: ";cin>>nr;
while (nr!=14)
{ switch (nr)
{case 1: //l.Creare();
cin>>l;
break;
case 2: l.Afisare();
//cout<<l;
break;
case 3: cout<<"dati val "; cin>>val;
l.InsertInceput(val);
l.Afisare(); break;
case 4: cout<<"dati val "; cin>>val;
l.InsertSf(val);
l.Afisare(); break;
case 5: cout<<"dati nodPoz si val ";
cin>>infoNod; cin>>val;
l.InsertBefore(infoNod, val);
l.Afisare(); break;
case 6: cout<<"dati nodul dupa care inserati "; cin>>infoNod;
cout<<"dai val"; cin>>val;
l.InsertAfter(infoNod, val);
l.Afisare(); break;
case 7: cout<<"dati index si val ";
cin>>index; cin>>val;
l.InsertIndex(index, val);
l.Afisare(); break;
case 8: cout<<"dati val"<<endl; cin>>val;
l.StergereVal(val);
l.Afisare(); break;
case 9: cout<<"dati pozitia"; cin>>index;
l.StergereIndex(index);
l.Afisare(); break;
case 10: cout<<"dati vechea valoare "; cin>>oldVal;
cout<<"dati noua valoare "; cin>>val;
l.Modifica(oldVal, val);
l.Afisare(); break;
case 11: cout<<"dati val cautata"; cin>>val;
if (l.Gasit(val)) cout<<"val se gaseste in lista"<<endl;
else cout<<"val nu se gaseste in lista"<<endl;
break;
case 12: l.Distrugere(); break;
case 13: LinkedList k;
cout<<"Pt a 2-a lista: ";
k.Creare();
if (l==k) cout<<"Listele sunt egale"<<endl;
else cout<<"Listele nu sunt egale"<<endl;
Structuri de Date 9
break;
}
cout<<"Optiunea: "; cin>>nr;
}
LinkedList k;
k=l;
k.Afisare();
cout<<"gata";
}
Structuri de Date 1
Laborator 8
Arborele binar este un tip particular de arbore care apare foarte des în
algoritmică. El este caracterizat prin faptul că fiecare nod al său are cel mult doi fii.
Arborele binar echilibrat este un arbore binar care are proprietatea că dferenţa
de noduri dintre subarborele său stâng şi subarborele său drept este maxim 1 şi toate
nivelele arborelui cu excepţia ultimului sunt complete.
Opearţiile care se vor efectua asupra arborilor binari echilibraţi sunt:
- crearea arborelui
- compararea a doi arbori binar
- copierea unui arbore binar
- distrugerea unui arbore binar
- parcurgerea în adâncime a unui arbore binar (inordine, preordine şi
postordine)
- parcurgerea în lăţime a unui arbore binar
Construcţia unui arbore binar echilibrat cu n noduri se desfăşoară după
următorul algoritm: se porneşte cu un arbore binar vid, se citeşte informaţia pentru
nodul rădăcină, după care se va apela recursiv procedura pentru determinarea
subarborelui său stâng, după care se va apela procedura pentru construcţia
subarborelui său drept. Algoritmul se termină când n=0.
Compararea a doi arbori binari se face în felul următor: dacă informaţia
conţinută în nodul curent din primul arbore este mai mică decât cea din nodul curent
din cel de-al doilea arbore, atunci spunem că primul arbore este mai mic decât al
doilea. Dacă nodul curent din primul arbore este nul, iar nodul curent din cel de-al
doilea arbore este nenul, atunci primul arbore este mai mic decât al doilea. Criteriul
se aplică recursiv subarborilor stâng şi drept. Se va returna în final 0 dacă arborii sunt
egali, 1 dacă primul este mai mare decât al doilea şi -1 în caz contrar.
Funcţia de copiere va copia arborele sursă în arborele destinaţie.
La distrugerea arborelui, se va distruge mai întâi nodul rădăcină după care se
va apela recursiv funcţia pentru distrugerea subarborelui stâng şi drept.
În continuare este prezentată clasa care implementează operaţiile enumerate
mai sus:
Btreeechil.h
class btree {
int val;
btree *st,*dr;
public:
btree();
~btree();
btree* create(int n);
int btreecompare(btree *bt1,btree * bt2);
Structuri de Date 2
void btreedestroy(btree*bt);
btree* copybtree(btree * sursa);
void inordine(btree *bt);
void preordine(btree *bt);
void postordine(btree *bt);
btree* cautare(btree *bt, int inf);
void bredth(btree *bt);
};
Btreeechil.cpp
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include”Breeechil.h”
btree::btree()
{
st=NULL;
dr=NULL;
}
btree::~btree()
{
btreedestroy(this);
}
btree* btree::create(int n)
{
int ns,nd,inf;
if (n==0) return NULL;
else {
cin>>inf;
val=inf;
ns=(n-1)/2;
nd=(n-ns-1);
if (ns>0)
{
st=new btree;
st->create(ns);
}
if (nd>0)
{
dr=new btree;
dr->create(nd);
}
}
return this;
}
exBtreeechil.cpp
#include”Btreeechil.cpp”
void main()
{ btree *bt,*copie;
Structuri de Date 5
btree *bt1;
int n;
int comp;
printf("Introduceti numarul de noduri din arbore\n");
scanf("%d", &n);
printf("Introduceti nodurile\n");
bt->create(n);
printf("\nParcurgere in inordine\n");
bt->inordine(bt);
printf("\nParcurgere in preordine\n");
bt->preordine(bt);
printf("\nParcurgere in postordine\n");
bt->postordine(bt);
copie=bt->copybtree(bt);
printf("\nParcurgerea in inordine a copiei\n");
bt->inordine(copie);
comp=bt->btreecompare(bt,copie);
if (comp==0)
printf("\nCei doi arbori sunt identici\n");
else
if(comp==1)
printf("\nPrimul arbore este mai mare decat al doilea\n");
else
printf("\nAl doilea arbore este mai mare decat primul\n");
printf("Parcurgerea primului arbore in latime este:");
bt->bredth(bt);
printf("\nIntroduceti dimensiunea celui de-al doilea arbore\n");
scanf("%d",&n);
printf("\nIntroduceti nodurile celui de-al doilea arbore\n");
bt1->create(n);
printf("\nVom compara cei doi arbori\n");
comp=bt->btreecompare(bt,bt1);
if (comp==0)
printf("\nCei doi arbori sunt identici\n");
else
if(comp==1)
printf("\nPrimul arbore este mai mare decat al doilea\n");
else
printf("\nAl doilea arbore este mai mare decat primul\n");
getch();
bt->btreedestroy(bt);
bt->btreedestroy(bt1);
bt->btreedestroy(copie);
}
Structuri de Date 1
Laborator 9
class btree{
public:
int val;
btree *st,*dr;
btree();
~btree();
btree* insert(btree* bt,int inf);
btree* readbtree();
void btreedestroy(btree*bt);
void inordine(btree *bt);
void preordine(btree *bt);
void postordine(btree *bt);
btree* cautaRe(btree *bt, int inf);
btree* cautaIt(btree *bt, int inf);
void bredth(btree *bt);
btree* deletebtree(btree *nods);
};
Btreecautbin.cpp
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include”Btreecautbin.h”
btree::btree()
{
st=NULL;
dr=NULL;
}
btree::~btree()
{
btreedestroy(this);
}
btree* btree::readbtree()
{ int inf;
btree* bt=NULL;
scanf("%d",&inf);
while(inf!=0)
{bt=insert(bt,inf);
scanf("%d",&inf);
}
return bt;
}
exBtreecautbin.cpp
#include”Breecautbin.cpt”
void main()
{ btree *bt, *temp,*temp1,*aux;
int inf;
printf("\nIntroduceti elementele arborelui. Terminati cu 0\n");
bt->readbtree();
printf("\nParcurgere in inordine\n");
bt->inordine(bt);
printf("\nParcurgere in preordine\n");
bt->preordine(bt);
printf("\nParcurgere in postordine\n");
bt->postordine(bt);
printf("\nIntroduceti valoarea pe care doriti sa o cautati\n");
scanf("%d",&inf);
temp=bt->cautaRe(bt,inf);
Structuri de Date 6
if (temp!=NULL)
printf("\nValoarea %d se gaseste in arbore\n",inf);
else
printf("\nValoarea %d nu se gaseste in arbore\n",inf);
printf("Parcurgerea arborelui in latime este:");
bt->bredth(bt);
printf("\nIntroduceti valoarea pe care doriti sa o stergeti\n");
scanf("%d",&inf);
temp=bt->cautaRe(bt,inf);
if (temp!=NULL)
if(bt==temp)
{ temp1=bt->deletebtree(temp);
bt=temp1;
}
else
{
aux=bt;
int ok=0;
while(ok==0)
{ if(aux->st==temp)
{ temp1=bt->deletebtree(temp);
aux->st=temp1;
ok=1;
}
else
if(aux->dr==temp)
{ temp1=bt->deletebtree(temp);
aux->dr=temp1;
ok=1;
}
if(aux->val<inf)
aux=aux->dr;
else
aux=aux->st;
}
printf("\nParcurgere in inordine\n");
bt->inordine(bt);
getch();
bt->btreedestroy(bt);
}
}
Structuri de Date 52
Laborator 10
Grafuri
#include<stdio.h>
#include<conio.h>
#include<alloc.h>
#define MaxVertex 20
struct muchie{
int sursa;
int dest;
};
typedef struct muchie muchie;
struct list{
int val;
struct list *next;
};
void main()
{
graph g;
initGraph(&g);
printf("\nCitie graf. Terminati cu nod<0\n");
citireGraph(&g);
printf("\nGraful citit este:");
printGraph(&g);
destroyGraph(&g);
getch();
}
Structuri de Date 1
Laborator 11
Algoritmi de sortare
1.HeapSort-ul
Heap-ul este un arbore binar cu un câmp cheie în fiecare nod, astfel încât:
- toate frunzele din arbore se află pe două nivele adiacente;
- toate frunzele de pe cel mai de jos nivel apar la stânga şi toate nivelele, cu
excepţia eventual a celui mai de jos sunt pline;
- cheia din nodul rădăcină este cel puţin atât de mare cât cheile fiilor stâng şi
drept (dacă aceştia există) , iar subarborele stâng şi drept sunt la rândul lor
heap-uri.
Memorarea unui astfel de arbore se face într-un vector unidimensional.
Nodurile din arbore vor fi puse în vector în urma unei parcurgeri în lăţime.
Timpul de execuţie al acestui algoritm este O(n*log(n)) chiar şi în cazul cel
mai nefavorabil.
Vom scrie în continuare programul în C care realizează sortarea cu ajutorul
acestui algoritm.
#include<stdio.h>
#include<dos.h>
#include<conio.h>
void main()
{ int v[50];
int n;
printf("\nIntroduceti numarul de elemente:");
scanf("%d",&n);
printf("\nIntroduceti elementele:");
for(int i=0;i<n;i++)
scanf("%d",&v[i]);
HeapSort(v,n);
printf("\nSirul ordonat este:\n");
for(int i=0;i<n;i++)
printf("%d ",v[i]);
getch();
}
După cum s-a văzut, la sortarea HeapSort s-a folosit de o funcţie HeapInsert
care inserează un element în heapul memorat de la adresa a la adresa b, dar care are
rădăcina de la adresa a vidă. Algoritmul presupune o parcurgere a heap-ului de la
rădăcină avându-se în vedere că:
- dacă noua valoare a lui x este mai mare decât cheile fiilor, atunci se pune x
chiar în rădăcină, şi algoritmul se termină, rezultatul fiind un heap memorat
de la adresa a la adresa b.
- dacă nu se determină cărui nod fiu îi corespunde valoarea cea mai mare a
cheii, se aduce acesta în rădăcină şi se continuă inserarea pe ramura acestuia
a valorii lui x, algoritmul terminându-se la parcurgerea totală a acestuia.
S-a folosit şi o funcţie de construire a heap-ului, HeapInsert. Pornind cu
arborele cu un element, care este evident un heap, se va insera succesiv câte un
element în el.
2. QuickSort-ul
Această metodă de sortare mai este cunoscută şi sub numele de sortare prin
partiţionare. Metoda are trei faze:
Structuri de Date 3
- partiţionarea în care elementele v[l], v[l+1], …, v[r] sunt împărţite în trei
clase:
o cele mai mici decât v[l]
o v[l]
o cele mai mari decât v[l]
De fapt v[l], numit şi pivot de partiţionare, este ales dintre elementele v[l],
v[l+1], …, v[r]; la finalul buclei while, i va fi egal cu k şi vor indica exact
poziţia la care se va afla elementul pivot v[l] în vectorul sortat; de aceea la
finalul acestui ciclu, vom interschimbă elementele v[l] şi v[r].
- sortarea părţii stângi, în care este apelată recursiv procedura pentru sortarea
elementelor aflate pe poziţiile v[l],…, v[k-1];
- sortarea părţii drepte, adică a elementelor mai mari decât v[k] şi anume
v[k+1],…, v[r].
Timpul mediu pentru QuickSort este logaritmic, iar acest algoritm este preferat
lui HeapSort deoarece constanta din faţa termenului dominant 2/log 2(e)=1.39 este mai
mică decât 2, care este coeficientul pentru HeapSort.
Codul în limbajul C este prezentat în continuare:
#include<stdio.h>
#include<conio.h>
void main()
{ int v[50];
int n,l,r;
printf("\nIntroduceti numarul de elemente:");
scanf("%d",&n);
printf("\nIntroduceti elementele:");
for(int i=0;i<n;i++)
scanf("%d",&v[i]);
l=0;
r=n-1;
SortQuick(v,l,r);
printf("\nSirul ordonat este:\n");
for(int i=0;i<n;i++)
printf("%d ",v[i]);
getch();
}
3. ShellSort-ul
void main()
{ int v[50];
int n;
Structuri de Date 5
printf("\nIntroduceti numarul de elemente:");
scanf("%d",&n);
printf("\nIntroduceti elementele:");
for(int i=0;i<n;i++)
scanf("%d",&v[i]);
ShellSort(v,n);
printf("\nSirul ordonat este:\n");
for(int i=0;i<n;i++)
printf("%d ",v[i]);
getch();
}