Skip to content
Snippets Groups Projects
Commit ff7edcce authored by POUPON UGO p2020982's avatar POUPON UGO p2020982
Browse files

fin TP2

parent c2786516
Branches master
No related tags found
No related merge requests found
Pipeline #152440 passed
Pipeline: Complexité - TP2

#152441

    ......@@ -30,20 +30,59 @@ void SkipListe::inserer(int v) {
    * }
    * inserer apres le curseur
    *
    * */
    SkipCellule* cur = m_sentinelle;
    *
    SkipCellule* cur1 = m_sentinelle;
    if(m_sentinelle->suivante.size()==2) {
    while(cur->suivante[1] && cur->suivante[1]->valeur < v) {
    cur = cur->suivante[0];
    while(cur1->suivante[1] && cur1->suivante[1]->valeur < v) {
    cur1 = cur1->suivante[1];
    }
    }
    while(cur->suivante[0] && cur->suivante[0]->valeur < v) {
    cur = cur->suivante[0];
    SkipCellule* cur0 = cur1;
    while(cur0->suivante[0] && cur0->suivante[0]->valeur < v) {
    cur0 = cur0->suivante[0];
    }
    nlle->suivante[0] = cur0->suivante[0];
    cur0->suivante[0] = nlle;
    if(m_sentinelle->suivante.size()==2 && pile_ou_face()) {
    std::cout << "Valeur choisie : " << v << std::endl;
    nlle->suivante.push_back(nullptr);
    nlle->suivante[1] = cur1->suivante[1];
    cur1->suivante[1] = nlle;
    }
    nlle->suivante[0] = cur->suivante[0];
    cur->suivante[0] = nlle;
    */
    int nv_max = m_sentinelle->suivante.size()-1;
    int nv_courant = nv_max;
    SkipCellule* precedentes[nv_max+1];
    SkipCellule* cur = m_sentinelle;
    while(nv_courant>=0) {
    while(cur->suivante[nv_courant] && cur->suivante[nv_courant]->valeur < v) {
    cur = cur->suivante[nv_courant];
    }
    precedentes[nv_courant] = cur;
    nv_courant--;
    }
    nv_courant = 0;
    nlle->suivante[nv_courant] = precedentes[nv_courant]->suivante[nv_courant];
    precedentes[nv_courant]->suivante[nv_courant] = nlle;
    nv_courant++;
    while(nv_courant<=nv_max) {
    if(pile_ou_face()) {
    nlle->suivante.push_back(nullptr);
    nlle->suivante[nv_courant] = precedentes[nv_courant]->suivante[nv_courant];
    precedentes[nv_courant]->suivante[nv_courant] = nlle;
    nv_courant++;
    } else {
    return;
    }
    }
    while(pile_ou_face()) {
    m_sentinelle->suivante.push_back(nullptr);
    nlle->suivante.push_back(nullptr);
    m_sentinelle->suivante[nv_courant]=nlle;
    nv_courant++;
    }
    }
    SkipCellule* SkipListe::chercher(int v) {
    ......@@ -64,27 +103,43 @@ SkipCellule* SkipListe::chercher(int v) {
    * Sinon
    * retourner nullptr
    *
    */
    SkipCellule* cur = m_sentinelle;
    std::cout << "Valeur recherchée: " << v << std::endl;
    //std::cout << "Valeur recherchée: " << v << std::endl;
    if(m_sentinelle->suivante.size()==2) {
    while(cur->suivante[1] != nullptr && cur->suivante[1]->valeur < v) {
    std::cout << "Niv 1 " << cur->valeur << std::endl;
    //std::cout << "Niv 1 " << cur->valeur << std::endl;
    cur = cur->suivante[1];
    }
    std::cout << "Sortie du while Niv 1" << std::endl;
    //std::cout << "Sortie du while Niv 1" << std::endl;
    }
    while(cur->suivante[0] != nullptr && cur->suivante[0]->valeur < v) {
    std::cout << "Niv 0 " << cur->suivante[0]->valeur << std::endl;
    //std::cout << "Niv 0 " << cur->suivante[0]->valeur << std::endl;
    cur = cur->suivante[0];
    }
    if(cur != m_sentinelle && cur->suivante[0] != nullptr && cur->suivante[0]->valeur == v) {
    std::cout << "Valeur trouvée: " << cur->suivante[0]->valeur << std::endl;
    //std::cout << "Valeur trouvée: " << cur->suivante[0]->valeur << std::endl;
    return cur->suivante[0];
    }
    std::cout << "Valeur non trouvée: " << v << std::endl;
    //std::cout << "Valeur non trouvée: " << v << std::endl;
    return nullptr;
    */
    int nv_max = m_sentinelle->suivante.size()-1;
    int nv_courant = nv_max;
    SkipCellule* cur = m_sentinelle;
    while(nv_courant>=0) {
    while(cur->suivante[nv_courant] != nullptr && cur->suivante[nv_courant]->valeur < v) {
    cur = cur->suivante[nv_courant];
    }
    nv_courant--;
    }
    if(cur!=m_sentinelle && cur->suivante[0]!=nullptr && cur->suivante[0]->valeur == v) {
    return cur->suivante[0];
    }
    return nullptr;
    }
    ......@@ -103,28 +158,32 @@ bool SkipListe::test_tri() {
    return true ;
    }
    void SkipListe::afficher(int niv) {
    std::cout << "[ " ;
    //parcours lineaire du niveau 0
    SkipCellule* courante = m_sentinelle->suivante[0] ;
    while(courante) {
    std::cout << courante->valeur << " " ;
    courante = courante->suivante[niv] ;
    void SkipListe::afficher() {
    for(int i = 0; i<m_sentinelle->suivante.size(); i++) {
    std::cout << "[ " ;
    //parcours lineaire du niveau 0
    SkipCellule* courante = m_sentinelle->suivante[i] ;
    while(courante) {
    std::cout << courante->valeur << " " ;
    courante = courante->suivante[i] ;
    }
    std::cout << "]" << std::endl ;
    }
    std::cout << "]" << std::endl ;
    }
    void SkipListe::ajouter_niveau() {
    int nv_max = m_sentinelle->suivante.size()-1;
    m_sentinelle->suivante.push_back(nullptr);
    SkipCellule* cur0 = m_sentinelle->suivante[0];
    SkipCellule* cur0 = m_sentinelle->suivante[nv_max];
    SkipCellule* prec = m_sentinelle;
    while(cur0->suivante[0]) {
    while(cur0->suivante[nv_max]) {
    if(pile_ou_face()) {
    cur0->suivante.push_back(nullptr);
    prec->suivante[1] = cur0;
    prec->suivante[nv_max+1] = cur0;
    prec = cur0;
    }
    cur0 = cur0->suivante[0];
    cur0 = cur0->suivante[nv_max];
    }
    }
    ......
    ......@@ -23,7 +23,7 @@ class SkipListe {
    SkipCellule* chercher(int v) ;
    /* affichage */
    void afficher(int niv) ;
    void afficher() ;
    /* ajouter niveau */
    void ajouter_niveau();
    ......
    ......@@ -4,14 +4,14 @@
    #include <random>
    int main() {
    { //insertion en s'assurant du tri
    SkipListe sl ;
    for(int i = 20; i >= 0; --i) {
    sl.inserer(i) ;
    }
    sl.afficher(0) ;
    sl.afficher() ;
    assert(sl.test_tri()) ;
    ......@@ -21,11 +21,14 @@ int main() {
    assert(sl.chercher(1000)==nullptr);
    //ajout de niveau et test de insertion et recherche avec niveau
    sl.ajouter_niveau();
    sl.afficher(1);
    sl.afficher();
    assert(sl.chercher(10)!=nullptr);
    sl.inserer(10);
    sl.afficher(0);
    sl.afficher();
    for(int i = 21; i<30; i++) {
    sl.inserer(i);
    }
    sl.afficher();
    }
    ......@@ -36,16 +39,14 @@ int main() {
    std::default_random_engine rd ;
    std::uniform_int_distribution<int> rand_int(0,99) ;
    for(int i = 20; i >= 0; --i) {
    for(int i = 80; i >= 0; --i) {
    sl.inserer(rand_int(rd)) ;
    }
    sl.afficher(0) ;
    sl.afficher() ;
    assert(sl.test_tri()) ;
    sl.ajouter_niveau();
    sl.afficher(1);
    }
    }
    0% Loading or .
    You are about to add 0 people to the discussion. Proceed with caution.
    Finish editing this message first!
    Please register or to comment