Sunteți pe pagina 1din 15

TEME PENTRU PROIECT LA STRUCTURI DE DATE (SD)

1. Să se realizeze un program care sortează un vector V cu 8 elemente prin interclasare (Merge


Sort).

1.1 Codul sursa al programului


#include<conio.h>
#include<stdio.h>
int a[200], n;
void citire () {
int i;
printf ("\n\n Dimesiunea vectorului:");scanf("%d",&n);
printf ("\n\n introduceti numarul de elemente ale vectorului: \n\n");
for (i=1; i<=n; i++) {
printf ("a[%d]=",i);
scanf("%d",&a[i]);
}
} /*sfarsit citire*/
void afisare (){
int i;
printf ("A=(");
for(i=1;i<n;i++)
printf("%d,",a[i]);
printf("%d) \n\n" ,a[n]);
} /*sfarsit afisare*/
void Mergesort(int st, int dr){
int i,j,k,m, b[100];
if (dr>st){
m=(st+dr)/2;
Mergesort(st,m);
Mergesort(m+1,dr);
for (i=m+1; i>st; i--)
b[i-1]=a[i-1];
for (j=m; j<dr; j++)
b[m+dr-j]=a[j+1];
for (k=st; k<=dr; k++)
a[k] = (b[i]<b[j]) ? b[i++] : b[j--];
}
}/*sfarsit sortare*/
void main(){
system ("cls");
citire();
printf("Vectorul initial este:\n");
afisare();
Mergesort(0,n);
printf("Vectorul sortat prin interclasare este:\n");
afisare();
getch(); }
1.2 Rularea aplicatiei
2. Să se realizeze un program care sortează un vector V cu 9 elemente prin metoda sortării
rapide (Quick Sort).
2.1 Codul sursa
#include<conio.h>
#include<stdlib.h>
#include<stdio.h>
#define lungmax 20
typedef struct {
int cheie;
}tablou;
tablou a[lungmax];
//vectorul a este de tip tablou, adica structura cu int cheie
int n;
void citire() {
int i;
printf("\n\n\nDati dimensiunea vectorului: ");scanf("%d",&n);
printf("\n\nIntroduceti elementele vectorului:\n\n");
for(i=1;i<=n;i++) {
printf(" a[%d]=",i);
scanf("%d",&a[i].cheie);
}
}/*end citire*/
void afisare() {
int i;
printf(" A=(");
for(i=1;i<n;i++)
printf("%d,",a[i].cheie);
printf("%d) \n\n",a[n].cheie);
}/*end afisare*/
void Sortare(int s,int d){
//Variabile
int i,j ;
tablou x,w;
x=a[s+(d-s)/2]; //luam mijlocul intervalului
i=s;
j=d;
while (i<=j) {
while (a[i].cheie<x.cheie)
i=i+1;
while (a[j].cheie>x.cheie)
j=j-1;
if (i<=j){
w=a[i];
a[i]=a[j];
a[j]=w;
i=i+1;
j=j-1;
}//end if
}
//cand nu mai avem ce face schimbam intervalul
if (s<j)
Sortare(s,j);
if (i<d)
Sortare(i,d);
}
void main(){
int i;
system ("cls");
citire();
printf("Vectorul initial este:\n");
afisare();
Sortare(1,n);
printf("Tabloul sortat prin metoda sortarii rapide este:\n");
afisare();
getch();
}
2.2 Rularea aplicatiei

3. Să se realizeze un program care sortează un vector V cu 7 elemente prin metoda bulelor


(Bubble Sort).
3.1 Codul sursa
#include<conio.h>
#include<stdlib.h>
#include<stdio.h>
#define lungmax 20
typedef struct {
int cheie;
}tablou;
tablou t[lungmax];
int n;
void citire() {
int i;
printf("\n\n\nDati dimensiunea vectorului: ");scanf("%d",&n);
printf("\n\nIntroduceti elementele vectorului:\n\n");
for(i=1;i<=n;i++) {
printf(" t[%d]=",i);
scanf("%d",&t[i].cheie);
}
}/*end citire*/
void afisare() {
int i;
printf(" Vectorul V=(");
for(i=1;i<n;i++)
printf("%d,",t[i].cheie);
printf("%d) \n\n",t[n].cheie);
}/*end afisare*/
void sortare_bubbleSort(){
int i,test;
tablou var;
do{
test = 1; //if test==1 - sirul este sortat
for(i=1; i<n; i++)
if(t[i].cheie>t[i+1].cheie){ //compar doua cate doua elementele sirului
var =t[i]; //se executa interschimbarea
t[i]=t[i+1];
t[i+1]= var;
test=0;
}
}while(test==0);
}/*sfarsit sortare*/
void main(){
system ("cls");
citire();
printf("Vectorul initial este:\n");
afisare();
sortare_bubbleSort();
printf("Tabloul sortat prin metoda Bubble Sort este:\n");
afisare();
getch();
}
3.2 Rularea aplicatiei

4. Să se realizeze un program care permite efectuarea următoarelor operații asupra unei liste liniare
simplu înlănţuite implementate prin tipul tablou.

#include<stdio.h>
#include<conio.h>
#include<stdio.h>
#define lung_max 10
typedef int nod;
typedef struct
{
nod elemente[lung_max];
int ultim;
}lista;
lista l;
int test, test2;
int lista_vida(int test){
if (l.ultim==0) test=1;
else test=0;
return test;
}
int lista_plina(int sw){
if (l.ultim==lung_max) sw=1;
else sw=0;
return sw;
}
void creare(void){
int i;
printf("\nCreare lista");
printf("\nSe pot introduce %d elemente\n",lung_max);
printf("\nCate elemente doriti sa aibe lista: ");fflush(stdin);
scanf("%d",&l.ultim);
for(i=0;i<l.ultim;i++)
{
printf("\nIntroduceti elementul[%d]= ",i); fflush(stdin);
scanf("%d",&l.elemente[i]);
}
}
void afisare(void){
int i,lista_vida;
if(lista_vida)
printf("\n Lista este vida!\n\n");
else
{
printf("\n\nElementele listei sunt urmatoarele:\n\n");
for(i=0;i<l.ultim;i++)
printf("%d ",l.elemente[i]);
}
}
void inserare(void){
int i;
nod e;
printf(" Introduceti un element: ");
scanf("%d",&e);
for(i=l.ultim++;i>0;i--)
l.elemente[i]=l.elemente[i-1];
l.elemente[0]=e;
}
int main()
{
printf("\n \t Crearea si afisarea unei liste liniare simplu inlantuite");
printf("\n \t \t cu ajutorul tipului tablou");
creare();
afisare();
if(lista_plina)
printf("\n\n Lista este plina!!");
else{
printf("\n \n inserarea unui element in fata listei");
inserare();
afisare();
creare();

}
getch();
}
5. Să se realizeze un program care permite efectuarea următoarelor operații asupra unei liste liniare
simplu înlănţuite folosind alocare dinamică (pointeri).
6. Să se realizeze un program care permite efectuarea următoarelor operații asupra unei liste liniare
simplu înlănţuite folosind alocare dinamică (pointeri).

#include<iostream>
#include<conio.h>
using namespace std;
struct nod {
int nr;
nod* leg;
};
nod* v, * sf, * d, * c;
int val, val1, i, info, n;
void adaugare(nod*& v, nod*& sf, int val) {
nod* c;
if (v == 0) {
v = new(nod);
v->nr = val;
v->leg = 0;
sf = v;
}
else {
c = new(nod);
sf->leg = c;
c->nr = val;
c->leg = 0;
sf = c;
}
};
void inserare_inainte(nod*& v, int val, int val1) {
nod* c, * d;
if (v->nr == val) {
d = new nod;
d->nr = val1;
d->leg = v;
v = d;
}
else {
c = v;
while (c->leg->nr != val) c = c->leg;
d = new nod;
d->nr = val1;
d->leg = c->leg;
c->leg = d;
}
}
void listare(nod* v) {
nod* c = v;
while (c) {
cout << c->nr << " ";
c = c->leg;
}
cout << endl;
}
int main(int argc, char* argv[]) {
cout << "Dati numarul de noduri:"; cin >> n;
for (i = 1; i <= n; i++) {
cout << "info:"; cin >> info;
adaugare(v, sf, info);
}
listare(v);
cout << "inserati valoarea:"; cin >> val1;
cout << "inaintea nodului cu informatia:"; cin >> val;
inserare_inainte(v, val, val1);
listare(v);
listare(v);
_getch();
return 0;
}

7. Să se realizeze un program care permite efectuarea următoarelor operații asupra unei liste liniare
dublu înlănţuite folosind alocare dinamică (pointeri).
8. Să se realizeze un program care permite efectuarea următoarelor operații asupra unei liste liniare
dublu înlănţuite folosind alocare dinamică (pointeri).

#include<iostream>
#include<conio.h>
using namespace std;
struct nod {
int nr;
nod* ls, * ld;
};
nod* s, * d, * c, * e;
int n, m, i, val;
void creare(nod*& s, nod*& d) {
cout << "info="; cin >> n;
s = new nod;
s->nr = n;
s->ld = 0;
s->ls = 0;
d = s;
}
void adaug_s(nod*& s, nod* d) {
nod* c;
cout << "info:"; cin >> n;
c = new nod;
c->nr = n;
c->ls = 0;
c->ld = s;
s->ls = c;
s = c;
}
void adaug_d(nod* s, nod*& d) {
cout << "info="; cin >> n;
c = new nod;
c->nr = n;
c->ld = 0;
d->ld = c;
c->ls = d;
d = c;
}
void adaug_i(nod* s, nod*& d) {
cout << "Dupa care inregistrare adaugam?"; cin >> val;
cout << "info="; cin >> n;
nod* c = s;
while (c->nr != val) c = c->ld;
if (c == d) {
e = new nod;
e->nr = n;
e->ld = 0;
d->ld = e;
e->ls = d;
d = e;
}
else {
e = new nod;
e->nr = n;
e->ld = c->ld;
c->ld->ls = e;
e->ls = c;
c->ld = e;
}
}
void sterg(nod*& s, nod*& d, int n) {
if (s == d) {
e = s;
s = d = 0;
}
else {
if (s->nr == n) {
e = s;
s = s->ld;
e->ld = 0;
s->ls = 0;
}
else if (d->nr == n) {
e = d;
d = d->ls;
e->ls = 0;
d->ld = 0;
}
else {
c = s;
while (c->ld->nr != n)c = c->ld;
e = c->ld;
e->ld->ls = c;
c->ld = e->ld;
e->ld = 0; e->ls = 0;
if (e = d) d = c;
}
}
delete e;
}
void listare_s(nod* s, nod* d) {
if (!s) {
cout << "Lista este vida!";
}
else {
c = s;
cout << "Listez de la stanga la dreapta: ";
while (c) {
cout << c->nr << " ";
c = c->ld;
}
}
cout << endl;
}
void listare_d(nod* s, nod* d) {
if (!s) {
cout << "Lista este vida!";
}
else {
c = d;
cout << "Listez de la dreapta la stanga: ";
while (c) {
cout << c->nr << " ";
c = c->ls;
}
}
cout << endl;
}
int main(int argc, char* argv[]) {
int val0, val1;
cout << "** Operatii asupra unei liste alocate dublu inlantuit** " << endl << endl;
cout << "Creez primul nod al listei." << endl;
creare(s, d);
do {
cout << "Cate inregistari adaugam la dreapta?";
cin >> val0;
} while (val0 < 1);
for (i = 1; i <= val0; i++) { adaug_d(s, d); }
do {
cout << "Cate inregistrari adaugam la stanga?";
cin >> val1;
} while (val1 < 1);
for (i = 1; i <= val1; i++) { adaug_s(s, d); }
listare_s(s, d);
listare_d(s, d);
cout << endl;
cout << "Inseram un nod in interiorul listei:" << endl;
adaug_i(s, d);
listare_s(s, d);
listare_d(s, d);
cout << endl;
_getch();

cout << "Stergem un nod oarecare al listei:" << endl;


cout << "Ce nod stergem?"; cin >> n;
sterg(s, d, n);
listare_s(s, d);
listare_d(s, d);
_getch();
return 0;
}

9. Să se realizeze un program care permite efectuarea următoarelor operații asupra unei stive
implementate prin tipul tablou
 crearea stivei
 inserarea unui element în vârful stivei
 afișarea elementului din vârful stivei
 suprimarea vârfului stivei

#include <iostream>
using namespace std;
struct nod{int info;
nod* ant;};
nod* creeazanod(int info)
{
nod *nou=new nod();
nou->info=info;
nou->ant=NULL;
return nou;
}
bool isEmpty(nod *varf)
{
return varf==NULL;
}
void push(nod * &varf, int info)
{
nod* nou=creeazanod(info);
nou->ant=varf;
varf=nou;

}
int peek(nod *varf)
{
if(isEmpty(varf)) return NULL;
return varf->info;
}
int pop(nod* &varf)
{
if(isEmpty(varf)) return 0;
nod *tmp=varf;
varf=varf->ant;
int rezultat=tmp->info; delete tmp;
return rezultat;
}
int main()
{
nod *varf=NULL;
cout<<"Introduceti numarul de elemente urmat de elementele stivei"<<endl;
int x,n,nr,aux; cin>>x;
aux=x;
while(x)
{
cin>>n;
push(varf,n);//creearea stivei
x--;
cout<<pop(varf)<<" ";//afisarea stivei
}
cout<<endl<<"valoarea de adaugat in stiva: ";
cin>>nr; push(varf,nr);
cout<<endl<<"Valoarea din varful stivei este: "<<peek(varf);
pop(varf);
cout<<endl<<"Dupa eliminarea varfului: "<<peek(varf);
return 0;
}
10. Să se realizeze un program care permite efectuarea următoarelor operații asupra unei cozi
implementate prin tipul tablou
 creare
 afișarea primului element din faţa cozii
 afişarea conţinutului cozii (listare)
 adaugare nou element

#include <iostream>

using namespace std;


const int LIM = 100;
struct nod {
int info;
nod* urm;
};
nod* creeazanod(int info)
{
nod* nou = new nod();
nou->info = info;
nou->urm = NULL;
return nou;
}
bool isEmpty(nod* fata)
{
return fata == NULL;
}
void push(nod*& fata, nod*& spate, int info)
{
nod* nou = creeazanod(info);
if (spate != NULL)
spate->urm = nou;
spate = nou;
if (fata == NULL)
fata = nou;
}
int pop(nod*& fata)
{
if (isEmpty(fata)) return 0;
nod* tmp = fata;
fata = fata->urm;
int rezultat = tmp->info;
delete tmp;
return rezultat;
}
int ffront(nod*& fata)
{
return fata->info;
}
int main()
{
int x, n, y;
nod* fata = NULL;
nod* spate = NULL;
cout << "Introduceti nr de elemente urmat de elementele cozii" << endl;
cin >> x;
while (x)
{
cin >> n;
push(fata, spate, n);
cout << pop(fata) << " ";//afisarea
x--;
}
cout << endl << "Elementul care va fi adaugat cozii: ";
cin >> y;
push(fata, spate, y);
cout << "Ultimul element al cozii dupa adaugare: " << pop(fata);
cout << endl <<"Primul element al cozii:"<< ffront(fata)<<endl; // aici CRAPA ☹
return 0;
}

11. Să se realizeze un program care permite Căutarea și afișarea unui element într-o listă liniară simplu
înlănţuită creată prin tipul tablou.

#include <iostream>

using namespace std;


struct nod
{
int info;
nod * urm;
};
void afisare(nod * prim)
{
while(prim!=NULL)
{cout<<prim->info;
prim=prim->urm;}
}
void inserare( nod * prim, int x)
{
nod*p=new nod;
p->info=x;
p->urm=prim;
prim=p;
}
int cautarepozitie(nod * prim, int poz)
{
int i=0;
while(prim!=NULL && i<poz)
{
prim=prim->urm;
i++;
}
if(i==poz) return prim->info;
else return NULL;
}
int main()
{
nod *prim=NULL;
cout<<"Numarul de elemente ale stivei: ";
int n,x,y,i;
cin>>n;
for(i=1;i<=n;i++)
{
cin>>x;
inserare(prim,x);
}
afisare(prim);
cout<<endl<<"Pozitia elementului cautat: "; cin>>y;
cout<<"Elementul cautat este: "<<cautarepozitie(prim,y); // Crapăăă ☹
}

12. Să se realizeze un program care permite Căutarea și afișarea unui element într-o stivă implementată
prin tipul pointer.

#include <iostream>

using namespace std;


struct nod
{
int info;
nod * urm;
};
void afisare(nod * prim)
{
while(prim!=NULL)
{cout<<prim->info;
prim=prim->urm;}
}
void inserare( nod * prim, int x)
{
nod*p=new nod;
p->info=x;
p->urm=prim;
prim=p;
}
int cautarepozitie(nod * prim, int poz)
{
int i=0;
while(prim!=NULL && i<poz)
{
prim=prim->urm;
i++;
}
if(i==poz) return prim->info;
else return NULL;
}
int main()
{
nod *prim=NULL;
cout<<"Numarul de elemente ale stivei: ";
int n,x,y,i;
cin>>n;
for(i=1;i<=n;i++)
{
cin>>x;
inserare(prim,x);
}
afisare(prim);
cout<<endl<<"Pozitia elementului cautat: "; cin>>y;
cout<<"Elementul cautat este: "<<cautarepozitie(prim,y); // si aici crapa ☹
}

S-ar putea să vă placă și