C++中的双向链表

问题描述

嘿开发者,你能帮我解决这个练习吗,我做了 1 到 5,但我在最后的 5 和 6 中堆叠,谢谢


在 C++ 中管理双链对象列表:

  1. 创建动态点列表。

  2. 编写一个函数,允许在此列表中的任意位置添加一个点。

  3. 编写一个函数,允许修改列表中任意位置的点。

  4. 编写一个函数,允许您删除列表中任意位置的点。

  5. 编写一个函数,允许在此列表的任何位置可视化一个点。

  6. 考虑到 C++ 中异常的处理,在主函数中给出每个函数的使用示例。对于每种情况,查看执行屏幕截图。

  7. 对任何类型的对象列表重复相同的工作。 这就是我所做的:

    #include

     using namespace std;
    
     class Noeud {
       public:
         int cle;
       int donnee;
       Noeud * suivant;
       Noeud * precedent;
    
       Noeud() {
         cle = 0;
         donnee = 0;
         suivant = NULL;
         precedent = NULL;
       }
       Noeud(int k,int d) {
         cle = k;
         donnee = d;
       }
     };
    
     class ListDoublementChainee {
    
       public:
         Noeud * tete;
    
       ListDoublementChainee() {
         tete = NULL;
       }
       ListDoublementChainee(Noeud * n) {
         tete = n;
       }
    
       // 1.Verifiez si le Noeud existe à l'aide de la valeur de la cle
    
       Noeud * NoeudExiste(int k) {
         Noeud * temp = NULL;
         Noeud * ptr = tete;
    
         while (ptr != NULL) {
           if (ptr-> cle == k) {
             temp = ptr;
           }
           ptr = ptr-> suivant;
         }
    
         return temp;
       }
    
       //  fonction permettant d’ajouter un point 
    
       void ajouterNoeud(Noeud * n) {
         if (NoeudExiste(n-> cle) != NULL) {
           cout << "Le Noeud existe deja avec la valeur cle : " << n-> cle << ". Ajouter un autre Noeud avec une valeur de cle differente" << endl;
         } else {
           if (tete == NULL) {
             tete = n;
             cout << "Noeud ajoute comme Noeud d'en-tete" << endl;
           } else {
             Noeud * ptr = tete;
             while (ptr-> suivant != NULL) {
               ptr = ptr-> suivant;
             }
             ptr-> suivant = n;
             n-> precedent = ptr;
             cout << "Noeud ajoute OK" << endl;
           }
         }
       }
    
       // fonction permettant d’ajouter un point au debut
       void prependNoeud(Noeud * n) {
         if (NoeudExiste(n-> cle) != NULL) {
           cout << "Le Noeud existe deja avec la valeur cle : " << n-> cle << ". Ajouter un autre Noeud avec une valeur de cle differente" << endl;
         } else {
           if (tete == NULL) {
             tete = n;
             cout << "Noeud ajoute comme Noeud d'en-tete" << endl;
           } else {
             tete-> precedent = n;
             n-> suivant = tete;
             tete = n;
             cout << "Noeud ajoute OK" << endl;
           }
    
         }
       }
    
       // fonction permettant d’ajouter un point après un point particulier dans la liste 
       void ajouterNoeudApres(int k,Noeud * n) {
         Noeud * ptr = NoeudExiste(k);
         if (ptr == NULL) {
           cout << "Aucun Noeud n'existe avec la valeur cle : " << k << endl;
         } else {
           if (NoeudExiste(n-> cle) != NULL) {
             cout << "Noeud existe deja avec la valeur cle : " << n-> cle << ". Ajouter un autre Noeud avec une valeur de cle differente" << endl;
           } else {
             Noeud * suivantNoeud = ptr-> suivant;
             // Insertion à la fin
             if (suivantNoeud == NULL) {
               ptr-> suivant = n;
               n-> precedent = ptr;
               cout << "Noeud insere a la FIN" << endl;
             }
    
             //inserer entre
             else {
               n-> suivant = suivantNoeud;
               suivantNoeud-> precedent = n;
               n-> precedent = ptr;
               ptr-> suivant = n;
    
               cout << "Noeud insere entre les deux" << endl;
    
             }
    
           }
         }
       }
    
       // fonction permettant de supprimer un point le Noeud par cle unique à n’importe quel endroit de cette liste.
       void supprimerNoeudParCle(int k) {
         Noeud * ptr = NoeudExiste(k);
         if (ptr == NULL) {
           cout << "Aucun Noeud n'existe avec la valeur cle : " << k << endl;
         } else {
    
           if (tete-> cle == k) {
             tete = tete-> suivant;
             cout << "Noeud non encre avec la valeur cle : " << k << endl;
           } else {
             Noeud * suivantNoeud = ptr-> suivant;
             Noeud * prevNoeud = ptr-> precedent;
             // suppression à la fin
             if (suivantNoeud == NULL) {
    
               prevNoeud-> suivant = NULL;
               cout << "Noeud supprime à la FIN" << endl;
             }
    
             //Suppression entre
             else {
               prevNoeud-> suivant = suivantNoeud;
               suivantNoeud-> precedent = prevNoeud;
               cout << "Noeud supprime entre les deux" << endl;
    
             }
           }
         }
       }
    
       //  une fonction permettant de modifier un point par cle à n’importe quel endroit de cette liste
       void modifierNoeudParCle(int k,int d) {
    
         Noeud * ptr = NoeudExiste(k);
         if (ptr != NULL) {
           ptr-> donnee = d;
           cout << "Noeud modifie avec succes" << endl;
         } else {
           cout << "Noeud n'existe pas avec la valeur cle : " << k << endl;
         }
    
       }
    
       // fonction permettant de visualiser un point : 
       void AfficherListe() {
    
         if (tete == NULL) {
           cout << "Aucun Noeud dans la liste doublement chainee";
         } else {
             cout<<"-----------------------------------------------"<<endl;
           cout << "Valeurs de liste doublement chainee : "<<endl;
    
           Noeud * temp = tete;
    
           while (temp != NULL) {
             cout << "(" << temp-> cle << "," << temp-> donnee << ") <---> "<<endl;
             temp = temp-> suivant;
           }
           cout<<"-----------------------------------------------"<<endl;
         }
    
       }
    
     };
    
     int main() {
    
       ListDoublementChainee obj;
       int option;
       int cle1,k1,donnee1;
       do {
         cout << "\n Quelle operation voulez-vous effectuer ? Selectionnez Numero d'option. Entrez 0 pour sortir." << endl;
         cout << "1. ajouterNoeud()" << endl;
         cout << "2. prependNoeud()" << endl;
         cout << "3. ajouterNoeudApres()" << endl;
         cout << "4. supprimerNoeudParCle()" << endl;
         cout << "5. modifierNoeudParCle()" << endl;
         cout << "6. afficher()" << endl;
         cout << "7. Vider l'Ecran de programme" << endl << endl;
    
         cin >> option;
         Noeud * n1 = new Noeud();
         //Noeud n1;
    
         switch (option) {
         case 0:
           break;
         case 1:
           cout <<"Operation ajouter un Noeud  \c Entrez le cle & donnee du Noeud a ajouter" << endl;
           cin >> cle1;
           cin >> donnee1;
           n1-> cle = cle1;
           n1-> donnee = donnee1;
           obj.ajouterNoeud(n1);
           //cout<<n1.cle<<" = "<<n1.donnee<<endl;
           break;
    
         case 2:
           cout << "Operation prefixier un Noeud \nEntrez la cle et la donnee du Noeud a ajouter" << endl;
           cin >> cle1;
           cin >> donnee1;
           n1-> cle = cle1;
           n1-> donnee = donnee1;
           obj.prependNoeud(n1);
           break;
    
         case 3:
           cout << "Operation ajouter un Noeud apres\n Entrez le cle du noeud existant apres lequel vous souhaitez ajouter ce nouveau noeud : " << endl;
           cin >> k1;
           cout << "Entrez cle et la donnee du Nouveau Noeud en premier : " << endl;
           cin >> cle1;
           cin >> donnee1;
           n1-> cle = cle1;
           n1-> donnee = donnee1;
    
           obj.ajouterNoeudApres(k1,n1);
           break;
    
         case 4:
    
           cout << "Operation Supprimer Noeud par cle - \nEntrez le cle du Noeud a supprimer : " << endl;
           cin >> k1;
           obj.supprimerNoeudParCle(k1);
    
           break;
         case 5:
           cout << "Operation de modification de Noeud par cle - \nEntrez cle et la nouveau donnee a modifier" << endl;
           cin >> cle1;
           cin >> donnee1;
           obj.modifierNoeudParCle(cle1,donnee1);
    
           break;
         case 6:
           obj.AfficherListe();
    
           break;
         case 7:
           system("cls");
           break;
         default:
           cout << "Entrez le numero d'option approprie " << endl;
         }
    
       } while (option != 0);
    
       return 0;
     }
    

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)