Je suis nouveau à C ++. Aidez-moi s'il vous plaît la liste chaînée (Quelles sont les fonctions à ajouter)?

StackOverflow https://stackoverflow.com/questions/3031971

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.
}
Était-ce utile?

La solution

  1. 0 doit être NULL

  2. 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é.

  3. Pourquoi votre destructor virtuelle, avez-vous l'héritage?

  4. 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 un using namespace std; ou écrire (par exemple) au lieu de std::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 ints. 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.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top