You are on page 1of 16

LCSI

Main.cpp

#include "Header.h"

int main() {
Elem* cap;
Elem* cap1, * cap2, * cap3;
int n = 10;
initializare(cap);

for (int i = 0; i < n; ++i)


inserareFata(cap, n - i);

afisare(cap);

inserarePozitie(cap, 101, -20);


inserarePozitie(cap, 201, 0);
inserarePozitie(cap, 301, 1);
inserarePozitie(cap, 401, 11);
inserarePozitie(cap, 501, 5);
inserarePozitie(cap, 601, 21);
afisare(cap);

stergerePozitie(cap, -30);
stergerePozitie(cap, 0);
stergerePozitie(cap, 1);
stergerePozitie(cap, 10);
stergerePozitie(cap, 5);
stergerePozitie(cap, 200);
afisare(cap);

inversare(cap);
afisare(cap);

eliberareMemorie(cap);
afisare(cap);

cap1 = 0;
cap2 = 0;
for (int i = 0; i < n; i += 2) {
inserareFata(cap1, n - i);
inserareFata(cap2, n - i - 1);
}

afisare(cap1);
afisare(cap2);

cap3 = concatenare(cap1, cap2);


afisare(cap3);
eliberareMemorie(cap3);

cap3 = interclasare(cap1, cap2);


afisare(cap3);
eliberareMemorie(cap3);

eliberareMemorie(cap1);
eliberareMemorie(cap2);

return 0;
}

Functii.cpp

#include "Header.h"

void initializare(Elem*& cap) {


cout << "\nInitializarea listei...\n";
cap = 0;
}

void afisare(Elem* cap) {


Elem* p = cap;
cout << "\nAfisarea elementelor listei...\n";
if (p) {
while (p->succ != cap) {
cout << p->data << " ";
p = p->succ;
}
cout << p->data << " ";
}
else
cout << "\nLista vida.\n";
}

void inserareFata(Elem*& cap, int val) {


Elem* p, * q;
cout << "\nInserare in fata listei a valorii val = " << val << "...\n";
p = new Elem;
p->data = val;
if (cap == 0) {
cout << "\nCazul lista vida, inserez primul element...\n";
p->succ = p;
}
else {
cout << "\nCazul in care lista are deja elemente...\n";
p->succ = cap;
q = cap;
while (q->succ != cap)
q = q->succ;
q->succ = p;
}
cap = p;
}

void inserarePozitie(Elem*& cap, int val, int poz) {


Elem* p, * q;
int contor;

cout << "\nInserare in pozitia = " << poz << " a valorii " << val << "...\n";
if (poz <= 0)
cout << "Pozitie invalida - prea mica...";
else {
if (poz == 1)
inserareFata(cap, val);
else {
contor = 1;
q = cap;
while (contor < poz - 1 && q->succ != cap) {
++contor;
q = q->succ;
}
if (contor == poz - 1) {
cout << "\nPozitie intermediara...";
p = new Elem;
p->data = val;
p->succ = q->succ;
q->succ = p;
}
else
cout << "Pozitie invalida - prea mare...";
}
}
}

void stergerePozitie(Elem*& cap, int poz) {


Elem* p, * q;
int contor;

cout << "\nStergere in pozitia = " << poz << "...\n";


if (poz <= 0)
cout << "Pozitie invalida - prea mica...";
else {
if (poz == 1) {
cout << "\nStergerea capului listei...";
p = cap;
if (cap->succ == cap) {
cout << "\nStergerea singurului element din lista...";
cap = 0;
}
else {
cout << "\nStergerea capului cand lista are >1 element...";
q = cap;
while (q->succ != cap)
q = q->succ;
cap = cap->succ;
q->succ = cap;
}
delete p;
p = 0;
}
else {
contor = 1;
q = cap;
while (contor < poz - 1 && q->succ != cap) {
++contor;
q = q->succ;
}
if (contor == poz - 1) {
cout << "\nPozitie intermediara...";
p = q->succ;
q->succ = p->succ;
delete p;
p = 0;
}
else
cout << "Pozitie invalida - prea mare...";
}
}
}

void eliberareMemorie(Elem*& cap) {


cout << "\nEliberarea memoriei...";
while (cap)
stergerePozitie(cap, 1);
cap = 0;
}

void inversare(Elem*& cap) {


Elem* p1, * p2, * p3, *stop = cap;
cout << "\nInversare\n";
if (cap != 0) {
p1 = cap;
if (p1->succ != stop) {
p2 = p1->succ;
if (p2->succ != stop) {
p3 = p2->succ;
while (p3->succ != stop) {
p2->succ = p1;
p1 = p2;
p2 = p3;
p3 = p3->succ;
}
p2->succ = p1;
p1 = p2;
p2 = p3;
}
p2->succ = p1;
cap->succ = p2;
cap = p2;
}
else
cout << "doar un element";
}
else
cout << "lista vida";
}
Elem* concatenare(Elem* cap1, Elem* cap2) {
Elem* cap = 0;
int k = 1;
Elem* stop1 = cap1, * stop2 = cap2;
cout << "\nConcatenare...\n";
if (cap1 != 0) {
inserarePozitie(cap, cap1->data, k);
cap1 = cap1->succ;
++k;
}
while (cap1 != stop1) {
inserarePozitie(cap, cap1->data, k);
cap1 = cap1->succ;
++k;
}
if (cap2 != 0) {
inserarePozitie(cap, cap2->data, k);
cap2 = cap2->succ;
++k;
}
while (cap2 != stop2) {
inserarePozitie(cap, cap2->data, k);
cap2 = cap2->succ;
++k;
}

return cap;
}

Elem* interclasare(Elem* cap1, Elem* cap2) {


Elem* cap = 0;
int k = 1;
Elem* stop1 = cap1, * stop2 = cap2;
cout << "\nInterclasare...\n";
if (cap1 != 0 && cap2 != 0) {
inserarePozitie(cap, cap1->data, k);
cap1 = cap1->succ;
++k;
inserarePozitie(cap, cap2->data, k);
cap2 = cap2->succ;
++k;
}
while (cap1 != stop1 && cap2 != stop2) {
inserarePozitie(cap, cap1->data, k);
cap1 = cap1->succ;
++k;
inserarePozitie(cap, cap2->data, k);
cap2 = cap2->succ;
++k;
}
while (cap1 != stop1) {
inserarePozitie(cap, cap1->data, k);
cap1 = cap1->succ;
++k;
}
while (cap2 != stop2) {
inserarePozitie(cap, cap2->data, k);
cap2 = cap2->succ;
++k;
}

return cap;
}

Header.h

#pragma once
#include <iostream>
using namespace std;

struct Elem {
int data;
Elem* succ;
};

void initializare(Elem*& cap);


void afisare(Elem* cap);
void inserareFata(Elem*& cap, int val);
void inserarePozitie(Elem*& cap, int val, int poz);
void stergerePozitie(Elem*& cap, int poz);
void eliberareMemorie(Elem*& cap);

void inversare(Elem*& cap);

Elem* concatenare(Elem* cap1, Elem* cap2);


Elem* interclasare(Elem* cap1, Elem* cap2);
LSDI
Main.cpp

#include "Header.h"

int main() {
Elem* cap;
int n = 10;
initializare(cap);

for (int i = 0; i < n; ++i)


inserareFata(cap, n - i);

afisare(cap);
afisareDusIntors(cap);

inserarePozitie(cap, 101, -20);


inserarePozitie(cap, 201, 0);
inserarePozitie(cap, 301, 1);
inserarePozitie(cap, 401, 11);
inserarePozitie(cap, 501, 5);
inserarePozitie(cap, 601, 21);
afisare(cap);

stergerePozitie(cap, -30);
stergerePozitie(cap, 0);
stergerePozitie(cap, 1);
stergerePozitie(cap, 10);
stergerePozitie(cap, 5);
stergerePozitie(cap, 200);
afisare(cap);

eliberareMemorie(cap);
afisare(cap);

return 0;
}

Functii.cpp

#include "Header.h"

void initializare(Elem*& cap) {


cout << "\nInitializarea listei...\n";
cap = 0;
}

void afisare(Elem* cap) {


Elem* p = cap;
cout << "\nAfisarea elementelor listei...\n";
if (p) {
while (p != 0) {
cout << p->data << " ";
p = p->succ;
}
}
else
cout << "\nLista vida.\n";
}

void afisareDusIntors(Elem* cap) {


Elem* p = cap;
cout << "\nAfisarea elementelor listei...\n";
if (p) {
while (p->succ != 0) {
cout << p->data << " ";
p = p->succ;
}
cout << p->data << " ";

while (p != 0) {
cout << p->data << " ";
p = p->pred;
}
}
else
cout << "\nLista vida.\n";
}

void inserareFata(Elem*& cap, int val) {


Elem* p, * q;
cout << "\nInserare in fata listei a valorii val = " << val << "...\n";
p = new Elem;
p->data = val;
if (cap == 0) {
cout << "\nCazul lista vida, inserez primul element...\n";
p->pred = 0;
p->succ = 0;
}
else {
cout << "\nCazul in care lista are deja elemente...\n";
p->succ = cap;
cap->pred = p;
p->pred = 0;
}
cap = p;
}

void inserarePozitie(Elem*& cap, int val, int poz) {


Elem* p, * q;
int contor;

cout << "\nInserare in pozitia = " << poz << " a valorii " << val << "...\n";
if (poz <= 0)
cout << "Pozitie invalida - prea mica...";
else {
if (poz == 1)
inserareFata(cap, val);
else {
contor = 1;
q = cap;
while (contor < poz - 1 && q->succ != 0) {
++contor;
q = q->succ;
}
if (contor == poz - 1) {
p = new Elem;
p->data = val;
p->pred = q;
if (q->succ == 0) {
cout << "\nPozitia finala...";
p->succ = 0;
}
else {
cout << "\nPozitie intermediara...";
p->succ = q->succ;
q->succ->pred = p;
}
q->succ = p;
}
else
cout << "Pozitie invalida - prea mare...";
}
}
}

void stergerePozitie(Elem*& cap, int poz) {


Elem* p, * q;
int contor;

cout << "\nStergere in pozitia = " << poz << "...\n";


if (poz <= 0)
cout << "Pozitie invalida - prea mica...";
else {
if (poz == 1) {
cout << "\nStergerea capului listei...";
p = cap;
if (cap->succ == 0) {
cout << "\nStergerea singurului element din lista...";
cap = 0;
}
else {
cout << "\nStergerea capului cand lista are >1 element...";
cap = cap->succ;
cap->pred = 0;
}
delete p;
p = 0;
}
else {
contor = 1;
q = cap;
while (contor < poz - 1 && q->succ != 0) {
++contor;
q = q->succ;
}
if (contor == poz - 1) {
if (q->succ == 0) {
cout << "\nPozitie finala...";
p = q->succ;
q->succ = 0;
}
else {
cout << "\nPozitie intermediara...";
p = q->succ;
q->succ = p->succ;
p->succ->pred = q;
}
delete p;
p = 0;
}
else
cout << "Pozitie invalida - prea mare...";
}
}
}

void eliberareMemorie(Elem*& cap) {


cout << "\nEliberarea memoriei...";
while (cap)
stergerePozitie(cap, 1);
cap = 0;
}

Header.h

#pragma once
#include <iostream>
using namespace std;

struct Elem {
Elem* pred;
int data;
Elem* succ;
};

void initializare(Elem*& cap);


void afisare(Elem* cap);
void afisareDusIntors(Elem* cap);
void inserareFata(Elem*& cap, int val);
void inserarePozitie(Elem*& cap, int val, int poz);
void stergerePozitie(Elem*& cap, int poz);
void eliberareMemorie(Elem*& cap);

You might also like