Scrieti un program pentru determinarea principalelor operaţii pe o listă înlănţuită ce conţine numere întregi. Se vor dezvolta următoarele operaţii:
- generarea unei liste
- lungimea dintr-o lista
- adaugarea unui element intr-o lista: la inceputul listei, sau dupa un element dat
- modificarea valorii unui anumit element al listei
- stergerea unui element din lista
- stergerea primului element
- stergerea ultimului element
- stergerea unui anumit element
- afisarea listei
- distrugerea listei.
Răspunsuri la întrebare
#include <iostream>
#include <vector>
#include <fstream>
#include <algorithm>
template <class T>
class Node {
public:
T data;
Node<T>* ante, * urm;
Node<T>() {
ante = nullptr;
urm = nullptr;
}
};
template <class T>
class Lista {
private:
Node<T>* start, * end;
int dim;
public:
Lista() {
start = nullptr;
end = nullptr;
dim = 0;
}
unsigned size() {
return dim;
}
bool empty() {
return dim == 0;
}
void push_front(int key) {
Node<T>* nod_nou = new Node<T>;
nod_nou->data = key;
nod_nou->urm = start;
start = nod_nou;
if (empty()) {
end = nod_nou;
}
dim++;
}
void push_back(int key) {
if (empty()) {
push_front(key);
return;
}
Node<T>* nod_nou = new Node<T>;
nod_nou->data = key;
nod_nou->ante = end;
end->urm = nod_nou;
end = nod_nou;
dim++;
}
void pop_front() {
erase(start);
}
void pop_back() {
erase(end);
}
Node<T>* find(int key, Node<T>* start_cautare = nullptr) {
if (empty()) return nullptr;
Node<T>* curent = start;
if (start_cautare == nullptr)
curent = start;
while (curent != nullptr) {
if (curent->data == key)
return curent;
curent = curent->urm;
}
return nullptr;
}
void erase(Node<T>* nod) {
if (nod == nullptr)return;
Node<T>* a, * b;
a = nod->ante;
b = nod->urm;
if (a != nullptr) a->urm = b;
else start = b;
if (b != nullptr) b->ante = a;
else end = a;
delete nod;
dim--;
}
void remove(int key) {
Node<T>* adresa = find(key);
while (adresa != nullptr) {
erase(adresa);
Node<T>* adresa_urmatoare = adresa->urm;
adresa = find(key, adresa_urmatoare);
}
}
void insert(Node<T>* nod, int val) {
Node<T>* a = nod->ante;
Node<T>* nou = new Node<int>;
nou->data = val;
nou->urm = nod;
nod->ante = nou;
if (a != nullptr) {
a->urm = nou;
nou->ante = a;
a->urm = nou;
}
dim++;
}
void clear() {
while (!empty()) erase(start);
}
void print() {
Node<T>* curent = start;
while (curent != nullptr) {
std::cout << curent->data << " ";
curent = curent->urm;
}
}
~Lista() {
clear();
}
};
int main() {
Lista<int> a;
int alegere = 0;
do {
std::cout << "\n\nMENIU :";
std::cout << "\n1 . Adaugare element la capul listei";
std::cout << "\n2 . Adaugare element la coada listei";
std::cout << "\n3 . Sterge primul element din lista";
std::cout << "\n4 . Sterge ultimul element din lista";
std::cout << "\n5 . Cauta element";
std::cout << "\n6 . Sterge element (adresa)";
std::cout << "\n7 . Sterge element (valoare)";
std::cout << "\n8 . Inserare element";
std::cout << "\n9 . Verifica daca lista e goala";
std::cout << "\n10. Numar elemente din lista";
std::cout << "\n11. Afisare continut lista";
std::cout << "\n12. Goleste lista";
std::cout << "\n0 . Oprire program";
std::cout << "\nAlegeti optiunea : ";
std::cin >> alegere;
int val;
void* adr;
switch (alegere)
{
case 1:
std::cout << "Valoare :";
std::cin >> val;
a.push_front(val);
break;
case 2:
std::cout << "Valoare :";
std::cin >> val;
a.push_back(val);
break;
case 3:
a.pop_front();
break;
case 4:
a.pop_back();
break;
case 5:
std::cout << "Valoare :";
std::cin >> val;
std::cout << "Element gasit pe pozitia : " << a.find(val);
break;
case 6:
std::cout << "Adresa de sters :";
std::cin >> adr;
a.erase((Node<int>*) adr);
break;
case 7:
std::cout << "Valoare :";
std::cin >> val;
a.remove(val);
break;
case 8:
std::cout << "Valoare :";
std::cin >> val;
std::cout << "Adresa :";
std::cin >> adr;
a.insert((Node<int>*)adr, val);
break;
case 9:
std::cout << "Lista " << (a.empty() ? "" : "este") << " este goala";
break;
case 10:
std::cout << "In lista exista " << a.size() << " elemente";
break;
case 11:
std::cout << "Continut lista : ";
a.print();
break;
case 12:
a.clear();
break;
case 0:
std::cout << "Ati ales sa parasiti programul";
break;
default:
std::cout << "Alegere invalida";
break;
}
} while (alegere);
}
► Nota:
Programul dat contine ceva mai multe functii si e template, sper sa nu fie asta o problema