Je suis nouveau à C ++. Aidez-moi s'il vous plaît la liste chaînée (Quelles sont les fonctions à ajouter)?
-
27-09-2019 - |
Question
Bonjour à tous;
Salut, je suis débutant à C ++; S'il vous plaît aidez-moi à comprendre:
Quelles fonctions devrait être dans la classe de liste liée? Je pense qu'il devrait y avoir des opérateurs et surchargées << >>; S'il vous plaît aidez-moi à améliorer le code (style, erreurs, etc,) Merci pour l'avance. Igal.
Edit: C'est seulement la première étape, la suivante sera (je l'espère) avec des modèles.
S'il vous plaît examiner le petit code pour la liste entière (ci-joint MyNODE.h et ListDriver1.cpp); MyNODE.h
// This is my first attempt to write linked list. Igal Spector, June 2010.
#include <iostream.h>
#include <assert.h>
//Forward Declaration of the classes:
class ListNode;
class TheLinkedlist;
// Definition of the node (WITH IMPLEMENTATION !!!, without test drive):
class ListNode{
friend class TheLinkedlist;
public:
// constructor:
ListNode(const int& value, ListNode *next= 0);
// note: no destructor, as this handled by TheLinkedList class.
// accessor: return data in the node.
// int Show() const {return theData;}
private:
int theData; //the Data
ListNode* theNext; //points to the next node in the list.
};
//Implementations:
//constructor:
inline ListNode::ListNode(const int &value,ListNode *next)
:theData(value),theNext(next){}
//end of ListNode class, now for the LL class:
class TheLinkedlist
{
public:
//constructors:
TheLinkedlist();
virtual ~TheLinkedlist();
// Accessors:
void InsertAtFront(const &);
void AppendAtBack(const &);
// void InOrderInsert(const &);
bool IsEmpty()const;//predicate function
void Print() const;
private:
ListNode * Head; //pointer to first node
ListNode * Tail; //pointer to last node.
};
//Implementation:
//Default constructor
inline TheLinkedlist::TheLinkedlist():Head(0),Tail(0) {}
//Destructor
inline TheLinkedlist::~TheLinkedlist(){
if(!IsEmpty()){ //list is not empty
cout<<"\n\tDestroying Nodes"<<endl;
ListNode *currentPointer=Head, *tempPtr;
while(currentPointer != 0){ //Delete remaining Nodes.
tempPtr=currentPointer;
cout<<"The node: "<<tempPtr->theData <<" is Destroyed."<<endl<<endl;
currentPointer=currentPointer->theNext;
delete tempPtr;
}
Head=Tail = 0; //don't forget this, as it may be checked one day.
}
}
//Insert the Node to the beginning of the list:
void TheLinkedlist::InsertAtFront(const int& value){
ListNode *newPtr = new ListNode(value,Head);
assert(newPtr!=0);
if(IsEmpty()) //list is empty
Head = Tail = newPtr;
else { //list is NOT empty
newPtr->theNext = Head;
Head = newPtr;
}
}
//Insert the Node to the beginning of the list:
void TheLinkedlist::AppendAtBack(const int& value){
ListNode *newPtr = new ListNode(value, NULL);
assert(newPtr!=0);
if(IsEmpty()) //list is empty
Head = Tail = newPtr;
else { //list is NOT empty
Tail->theNext = newPtr;
Tail = newPtr;
}
}
//is the list empty?
inline bool TheLinkedlist::IsEmpty() const
{ return (Head == 0); }
// Display the contents of the list
void TheLinkedlist::Print()const{
if ( IsEmpty() ){
cout << "\n\t The list is empty!!"<<endl;
return;
}
ListNode *tempPTR = Head;
cout<<"\n\t The List is: ";
while ( tempPTR != 0 ){
cout<< tempPTR->theData <<" ";
tempPTR = tempPTR->theNext;
}
cout<<endl<<endl;
}
//////////////////////////////////////
Le test pilote:
//Driver test for integer Linked List.
#include <iostream.h>
#include "MyNODE.h"
// main Driver
int main(){
cout<< "\n\t This is the test for integer LinkedList."<<endl;
const int arraySize=11,
ARRAY[arraySize]={44,77,88,99,11,2,22,204,50,58,12};
cout << "\n\tThe array is: "; //print the numbers.
for (int i=0;i<arraySize; i++)
cout<<ARRAY[i]<<", ";
TheLinkedlist list; //declare the list
for(int index=0;index<arraySize;index++)
list.AppendAtBack( ARRAY[index] );//create the list
cout<<endl<<endl;
list.Print(); //print the list
return 0; //end of the program.
}
La solution
-
0 doit être NULL
-
en ligne uniquement dans le cas où vous ne vous inquiétez pas que votre code sera public, met habituellement la mise en œuvre dans le fichier Mylist.cpp de fichier séparé.
-
Pourquoi votre destructor virtuelle, avez-vous l'héritage?
-
Vous pouvez simplement définir le noeud struct plutôt classe séparée de son mieux définir votre liste pour la pratique comme dans stl. http://www.sgi.com/tech/stl/List.html http://www.cplusplus.com/reference/stl/list/
La commune en C au vecteur d'utilisation vs liste chaînée en Java http://www.yolinux.com/TUTORIALS/LinuxTutorialC++STL.html
Autres conseils
Quelles fonctions devraient être dans la classe de liste Linked?
Cela dépend de ce que vous devez faire. À tout le moins, on devrait sans doute être en mesure d'ajouter des éléments, et de regarder les éléments dans la liste.
(Ceci est le bon sens. Parce que si vous ne pouvez pas modifier ou lire votre liste de quelque façon, que pourrait-il jamais être utilisé?)
Je pense qu'il devrait y avoir des opérateurs surchargées << et >>;
Pourquoi? Que feraient-ils? Je suppose que vous operator <<
moyen de faire insertion, similaire à la façon dont les objets sont insérés dans les flux C ++ IO; mais ce qui devrait operator >>
faire exactement? Extraction / suppression des éléments de quelque sorte? Si vous implémentez l'insertion et l'extraction (?) De cette manière, probablement Noone sera en mesure de comprendre votre classe de liste chaînée. Une liste chaînée est pas un flux IO. (Ces opérateurs flux IO ont été choisis pour la brièveté.)
Je vous conseille contre la surcharge de l'opérateur si le sens de l'opération n'est pas claire. Je vous suggère de nommer plus explicitement vos opérations, par exemple en fournissant des méthodes add
et remove
(je devine toujours au sens de cette dernière opération >>
btw.).
S'il vous plaît me aider à améliorer le code (style, erreurs, etc,)
Je ne veux pas en faire le principal point de ma réponse, donc très brièvement sur le dessus de ma tête, quelques questions:
-
Vous devriez
#include <iostream>
au lieu de#include <iostream.h>
, puis ajoutez soit unusing namespace std;
ou écrire (par exemple) au lieu destd::cout
cout
. -
Essayez de se débarrasser de la
friend
. Vous devriez être en mesure de concevoir vos classes d'une manière qui ne nécessite pas.friend
est facilement utilisé à mauvais escient pour obtenir l'encapsulation autour correcte. Mais l'encapsulation est quelque chose que vous devriez vraiment penser en POO. -
Bien que ce n'est pas un conseil à donner à un C ++ débutant, si vous avez fait votre classe de liste chaînée dans une classe de modèle, il peut stocker des valeurs différentes que seulement
int
s. Il suffit de prendre cela comme une indication des améliorations futures.
Et enfin:
- Juste utiliser les conteneurs STL ( "Standard Template Library") qui sont inclus dans la bibliothèque standard C ++. Je sais que « rouler votre propre » aide à comprendre comment fonctionnent ces structures de données, mais sachez que la bibliothèque standard C ++ comprend déjà un ensemble solide et efficace des conteneurs de données.