Tienes varios errores en tu código.
En la función para añadir al inicio, creas un nuevo nodo que pones como inicio, pero no haces que la lista anterior apunte a él (sólo el nuevo nodo apunta a lista). Básicamente, falta la línea que tienes comentada, que supongo que lo habrás hecho porque te daba Segmentation Fault. Esto sucedería porque al principio, a_inici es NULL, de forma que haría falta un if para comprobarlo.
La función de añadir al final la veo horrible por un simple motivo. Estás guardando un puntero al inicio de la lista, pero no uno para el final. Así, si quieres añadir al algo al final, tienes que recorrer la lista entera para llegar al final y después añadir: pasas una operación que teniendo un puntero extra sería O(1) a una operación O(n), siendo n el número de elementos de la lista.
La función para mirar si está el elemento parece correcta, mientras que la de borrar no entiendo qué haces, pero no veo que recorras la lista, de forma que dudo que sea correcta.
He picado ahora cómo haría yo las funciones que implementas, no lo he probado en profundidad, pero parece que funcionan bien.
#include <iostream>
using namespace std;
struct Node {
int dada;
Node *seguent;
Node *anterior;
};
Node *inici = NULL, *final = NULL;
void afegirInici(int x) {
Node *p = new Node;
p->dada = x;
p->seguent = inici;
p->anterior = NULL;
if (inici != NULL) inici->anterior = p;
swap(p, inici);
if (final == NULL) final = inici;
}
void afegirFinal(int x) {
Node *p = new Node;
p->dada = x;
p->seguent = NULL;
p->anterior = final;
if (final != NULL) final->seguent = p;
swap(p, final);
if (inici == NULL) inici = final;
}
bool existeix(int x) {
Node *actual = inici;
while (actual != NULL) {
if (actual->dada == x) return true;
actual = actual->seguent;
}
return false;
}
//Esborra totes les ocurrencies de x a la llista
void esborrar(int x) {
Node *actual = inici;
while (actual != NULL) {
if (actual->dada == x) {
if (actual->anterior != NULL) actual->anterior->seguent = actual->seguent;
else inici = actual->seguent;
if (actual->seguent != NULL) actual->seguent->anterior = actual->anterior;
else final = actual->anterior;
Node *aux = actual->seguent;
delete actual;
actual = aux;
}
else actual = actual->seguent;
}
}
void llistar() {
Node *actual = inici;
while (actual != NULL) {
cout << actual->dada;
if (actual->seguent != NULL) cout << " <-> ";
actual = actual->seguent;
}
cout << endl;
}
int main() {
char c;
while (cin >> c) {
if (c == 'I') {
int x;
cin >> x;
afegirInici(x);
}
else if (c == 'F') {
int x;
cin >> x;
afegirFinal(x);
}
else if (c == 'E') {
int x;
cin >> x;
cout << (existeix(x)?"Existeix":"No existeix") << endl;
}
else if (c == 'L') llistar();
else {
int x;
cin >> x;
esborrar(x);
}
}
}
Te pongo la prueba que he hecho:
Entrada:
I 1 I 2 I 3
L
F 1
L
F 23
L
E 1
E 23
E 25
E 4
B 2
L
B 1
L
B 3
L
B 23
L
I 1
L
F 2
L
Salida:
3 <-> 2 <-> 1
3 <-> 2 <-> 1 <-> 1
3 <-> 2 <-> 1 <-> 1 <-> 23
Existeix
Existeix
No existeix
No existeix
3 <-> 1 <-> 1 <-> 23
3 <-> 23
23
1
1 <-> 2