Quantcast
Channel: CodeSnippet » strutture dinamiche
Viewing all articles
Browse latest Browse all 2

C++ Eliminazione in lista con puntatori

$
0
0

C++ Eliminazione in lista con puntatori E' un post proveniente da CodeSnippet.biz


Tempo fa avevo fatto uno snippet per l’inserimento e la cancellazione di elementi all’interno di una lista con puntatori. Ora vorrei ampliare il programma inserendo anche l’eliminazione. Il codice scritto l’altra volta lo potete vedere nel post che ho linkato.

Ora a quel codice aggiungo l’eliminazione.

void canc(list* &first, int position) {
    list* app=first;
    if(first != NULL) {
        if(position == 0) {
            first = first->next;
            delete app;
        }else {
            list* back = app;
            int count=0;
            while(count < position && app != NULL) {
                back = app;
                app = app->next;
                count++;
            }

            if(app != NULL) {
                if(app->next == NULL) {
                    back->next = NULL;
                delete app;
                }else {
                    back->next = app->next;
                    delete app;
                }
            }

        }
    }
}

Per l’eliminazione passiamo alla funzione il nodo padre e la posizione dell’elemento da eliminare (partendo da 0), questo per eliminare un elmento unico. Si può fare anche con l’inserimento dell’elmento, in modo tale da cancellare tutti gli elementi della lista che hanno il valore passato come parametro. Per ora propongo questa soluzione.

La funzione cancella in modo diverso l’elmento, a seconda che si trova in testa, in coda o al centro. Per quanto riguarda la testa, ovviamente, bisogna modificare il puntatore d’accesso alla lista, per la coda bisogna porre a NULL il puntatore next dell’ultimo elemento, per l’eliminazione centrale invece basta semplicemente aggiorare il puntatore. Il codice che mostra tutto è questo:

#include <iostream>

using namespace std;

struct list {
    int data;
    list* next;
};

void insert_back(list* &first, int data);
void print(list* first);
void canc(list* &first, int position);

int main() {
    list* first = NULL;

    insert_back(first, 1); //elemento in posizione 0
    insert_back(first, 2); //1
    insert_back(first, 3); //2
    insert_back(first, 4); //3
    insert_back(first, 5); //4

    cout< <"Lista inserita: \n";
    print(first);

    canc(first, 0); //elimina il primo elemento
    canc(first, 100); //non fa niente perchè non esiste il 100esimo elemento
    canc(first, 3); //cancella l'ultimo (erano 5, meno uno 4, partendo da zero a contare, 3)
    canc(first, 1); //cancella il secondo

    cout<<"Lista dopo l'eliminazione: \n";
    print(first); //stampa 2 4

    return 0;
}

void insert_back(list* &first, int data) {
    list* n = new list;
    n->data = data;
    n->next = NULL;

    if(first == NULL) {
        first = n;
    }else {
        list* app = first;
        while(app->next != NULL)
            app = app->next;

        app->next = n;
    }
}

void print(list* first) {
    list* n = first;
    while(n != NULL) {
        cout< <n->data< < " ";
        n = n->next;
    }
}

void canc(list* &first, int position) {
    list* app=first;
    if(first != NULL) {
        if(position == 0) {
            first = first->next;
            delete app;
        }else {
            list* back = app;
            int count=0;
            while(count < position && app != NULL) {
                back = app;
                app = app->next;
                count++;
            }

            if(app != NULL) {
                if(app->next == NULL) {
                    back->next = NULL;
                delete app;
                }else {
                    back->next = app->next;
                    delete app;
                }
            }

        }
    }
}
</iostream>

Come avevo detto prima questo cancella l’emento alla posizione i, con i passato come parametro. Sfruttando questa funzione si può benissimo farne una che invece cancella gli elementi che hanno come valore quello specificato come parametro alla funzione.

void canc2(list* &first, int element) {
    list* app=first;
    int i=0; //indice

    while(app != NULL) {
        if(app->data == element) {
            app = app->next;
            canc(first, i);
        }else {
            app = app->next;
            i++;
        }
    }
}

Questa funzione fa proprio questo, sfrutta quella precedente per cancellare tutti gli elementi della lista uguali al parametro passato!

L’esempio che testa il tutto è questo

#include <iostream>

using namespace std;

struct list {
    int data;
    list* next;
};

void insert_back(list* &first, int data);
void print(list* first);
void canc(list* &first, int position);

void canc2(list* &first, int element);

int main() {
    list* first = NULL;

    insert_back(first, 1); //elemento in posizione 0
    insert_back(first, 3); //1
    insert_back(first, 3); //2
    insert_back(first, 3); //3
    insert_back(first, 5); //4

    cout< <"Lista inserita: \n";
    print(first);

    canc2(first, 3); //cancella tutti i 3

    cout<<"Lista dopo l'eliminazione: \n";
    print(first); //stampa 1 5

    return 0;
}

void insert_back(list* &first, int data) {
    list* n = new list;
    n->data = data;
    n->next = NULL;

    if(first == NULL) {
        first = n;
    }else {
        list* app = first;
        while(app->next != NULL)
            app = app->next;

        app->next = n;
    }
}

void print(list* first) {
    list* n = first;
    while(n != NULL) {
        cout< <n->data< < " ";
        n = n->next;
    }
}

void canc(list* &first, int position) {
    list* app=first;
    if(first != NULL) {
        if(position == 0) {
            first = first->next;
            delete app;
        }else {
            list* back = app;
            int count=0;
            while(count < position && app != NULL) {
                back = app;
                app = app->next;
                count++;
            }

            if(app != NULL) {
                if(app->next == NULL) {
                    back->next = NULL;
                delete app;
                }else {
                    back->next = app->next;
                    delete app;
                }
            }

        }
    }
}
void canc2(list* &first, int element) {
    list* app=first;
    int i=0; //indice

    while(app != NULL) {
        if(app->data == element) {
            app = app->next;
            canc(first, i);
        }else {
            app = app->next;
            i++;
        }
    }
}
</iostream>

Se volete maggior informazioni usate i commenti per chiedere qualsiasi cosa.


Viewing all articles
Browse latest Browse all 2

Latest Images

Trending Articles