hello, I develop under CodeBlocks 17.12, I want to make a chained list.
That is the use of Class and Pointers, I was helped a little on other forum, but I have trouble using the functions "operator".
My program reads in a text format file a list of words, and dynamically allocates a pointer, then afterwards I make next or prev, and move in my list chained, I do some simple operation: like search a word, update of a word and so on, then finally I write in my file the list of words, then freedom the memory of the computer.
#include <iostream>
#include <fstream>
#include <string>
#include "liste.h"
/* les fonctions "particulières": constructeur, constructeur
* de copie et destructeur... elles n'ont pas de type de
* retour
*/
char reponse='Z';
int i_max=0;
Liste::Liste(){
/* rien à faire ici */
}
Liste::Liste(Liste const & other){
/* copier le contenu de other dans this */
}
Liste::~Liste(){
/* le destructeur, détruire tous les éléments de la liste*/
}
/* L'opérateur d'affectation, utilisera sans doute l'idiome
* copy and swap pour la facilité
*/
Liste & operator =(Liste const & other){
/* copier la liste recue en paramètre */
Liste copy{other};
/* intervertir le contenu de copy et de this */
swap(copy); //à déclarer et à implémenter
return *this;
} // copy est détruite ici
/* les autres fonctions que tu as déclarées */
Liste & Liste::add(std::string const &){
/* ce qu'il faut faire */
}
void Liste::charger_fichier(Liste const &){
int i=0;
ifstream fichier("/home/phipo/C++/ptr_chaine01/chaine.txt");
if(fichier)
{
string ligne; //Une variable pour stocker les lignes lues
while(getline(ligne)) //Tant qu'on n'est pas à la fin, on lit
{
Liste.add(ligne);
i= i+1;
cout << ligne << endl;
i_max =i;
}
}
else
{
cout << "ERREUR: Impossible d'ouvrir le fichier en lecture." << endl;
}
}
void Liste::ajouter_ptr(Liste const &){
/* ce qu'il faut faire */
}
void Liste::maj_ptr(Liste const &){
/* ce qu'il faut faire */
}
void Liste::supprimer_ptr(Liste const &){
/* ce qu'il faut faire */
}
void Liste:inserer_ptr(Liste const &){
/* ce qu'il faut faire */
}
void Liste::afficher_ptr(Liste const &){
char reponse_affiche='Z';
do
{
int i=0;
cout << "P/previous; N/next; Q/quit";
cin >> reponse_affiche; // pointeur qui pointera sur la réponse choisie
switch(reponse_affiche)
{
case'P':
{
i=i-1;
if (i>0)
{
Liste.previous;
cout << other.print() << endl;
}
}
break;
case'N':
{
i=i+1;
if (i<=i_max)
{
Liste.next;
cout << other.print() << endl;
}
}
break;
}while (reponse_affiche != 'Q');
}
}
void Liste::ecrire_fichier()Liste const &{
string const fichier("/home/phipo/C++/ptr_chaine01/chaine.txt");
ofstream monFlux(nomFichier.c_str());
if(monFlux)
{
string ligne; //Une variable pour stocker les lignes lues
while(i_max<=i)) //Tant qu'on n'est pas à la fin, on lit
{
monFlux << other.print()<< endl;
cout << ligne << endl;
}
}
else
{
cout << "ERREUR: Impossible d'ouvrir le fichier." << endl;
}
}
I can handle written French passably... (technical written French, lol)
In any case, in order to write the code for the copy constructor and add() method, you must consider how the list works. Pull out a piece of paper and a pencil and draw it.
First, all constructors must initialize first = nullptr;: an empty list.
Next, consider what you must do to add an element to the list:
• find the last element
• append a new node
For a doubly-linked list with common add() (append) operations, it might be worth the grief to also have a last pointer. This will make add()ing a new node very much more efficient.
With pictures:
initial state
first
↓
nullptr
↑
last
add("hello"):
first
↓
┌───────┐
nullptr ← │"hello"│ → nullptr
└───────┘
↑
last
add("world"):
first
↓
┌───────┐ ┌───────┐
nullptr ← │"hello"│ ←→ │"world"│ → nullptr
└───────┘ └───────┘
↑
last