0% found this document useful (0 votes)
40 views16 pages

SD Lab 4

The document describes the implementation of functions for a doubly linked list data structure in C++. It includes functions for initializing the list, inserting and deleting elements, traversing the list forward and backward, and concatenating and merging two lists. The main function tests the various list functions by creating a sample list, inserting and deleting elements, and combining lists.

Uploaded by

X
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
40 views16 pages

SD Lab 4

The document describes the implementation of functions for a doubly linked list data structure in C++. It includes functions for initializing the list, inserting and deleting elements, traversing the list forward and backward, and concatenating and merging two lists. The main function tests the various list functions by creating a sample list, inserting and deleting elements, and combining lists.

Uploaded by

X
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 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