Tableau de listes chainées

zarganomi Messages postés 30 Date d'inscription   Statut Membre Dernière intervention   -  
sambia39 Messages postés 610 Date d'inscription   Statut Membre Dernière intervention   -
Bonsoir,

aidez moi SVP, qui connait comment construire en c++ un tableau dont chaque case contient une liste chaînée d'entiers ?
je cherche sur google et j'ai rien trouvé :( , qui a un lien ou un cour sur ça, qui peut m'aidez ?
A voir également:

6 réponses

yougy2 Messages postés 445 Date d'inscription   Statut Membre Dernière intervention   127
 
Bonjour, qu'entends-tu par une liste chainée d'entiers ?
0
ElementW Messages postés 4814 Date d'inscription   Statut Contributeur Dernière intervention   1 223
 
std::list<int>
je présume.
0
zarganomi Messages postés 30 Date d'inscription   Statut Membre Dernière intervention  
 
c à dire un tableau comme suit:
0
zarganomi Messages postés 30 Date d'inscription   Statut Membre Dernière intervention  
 
vous connaissez pas comment faire ça ? pouvez vous me montrer comment coder la première case et l'afficher ? si vous avez du temps
0
Flexy4
 
Je pense que le mieux est de faire une liste de pointeur vers des listes.
Par exemple :
std::list<std::list<int> *>

Je ne sais pas si std::list est le conteneur de la std qui te conviens mais tu vois l'idée comme ça.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
zarganomi Messages postés 30 Date d'inscription   Statut Membre Dernière intervention  
 
Bonsoir SVP, j'ai écrit ce code (tableau de liste chaînées) pour un exemple d'un tableau statique de de taille 5 dont chaque case contient une liste chaînée de taille 2, dont le but que le programme me donne ça lors de l'execution:

1. remplir et afficher le tableau initialisé de liste.
2. remplir et afficher le tableau de liste après ajout.
1 // càd si je choisi 1
initialiser les différentes case:3
initialiser les différentes case:4
initialiser les différentes case:7
initialiser les différentes case:9
initialiser les différentes case:6

afficher:
3
4
7
9
6

2 // càd si je choisi 2
ajouter autres elements dans chaque celleule(liste) du tableau:5
ajouter autres elements dans chaque celleule(liste) du tableau:2
ajouter autres elements dans chaque celleule(liste) du tableau:1
ajouter autres elements dans chaque celleule(liste) du tableau:8
ajouter autres elements dans chaque celleule(liste) du tableau:4

afficher
3 5
4 2
7 1
9 8
6 4

Je teste mon code et je le corrige jusqu'à qu'il ne contient aucune erreur, mais nz je comprend pas pourquoi tous les fonctions d'initialisation, ajout et affichage ne fonctionnent pas! qui peut m'aider SVP !



#include <iostream>

using namespace std;

struct Node{
int num;
Node *nextNode;
Node *prevNode;
};

void initializeLists(Node* head, Node* Arraylist[], int MAX_INDEX);
void addNode(int num, int arrayIndex, Node* Arraylist[], int countArray[]);
void affiche_apres_initialisation (Node *p, Node* Arraylist[]);
void affiche_apres_ajout (Node *ptr, Node* Arraylist[]);

int main()
{
int MAX_INDEX(5);
Node* Arraylist[5];
int num;
int arrayIndex;
int countArray [2]; // taille de chaque list.
Node* head ;
head = NULL;

while (1){
int n;
cout << "1. remplir et afficher le tableau initialisé de liste." << endl;
cout << "2. remplir et afficher le tableau de liste apres ajout." << endl;
cin >> n;

if(n==1){

cout << "initialiser les differentes case: ";
cin >> num;
initializeLists( head, Arraylist, MAX_INDEX);
cout << "afficher:";
affiche_apres_initialisation (head, Arraylist);
}

else if (n==2){

cout << "ajouter autres elements dans chaque celleule(liste) du tableau: ";
cin >> Arraylist[arrayIndex]->num;
addNode( num, arrayIndex, Arraylist, countArray);
cout << "afficher:";
affiche_apres_ajout (head, Arraylist);
}
else{
cout << "BY"<< endl;
break;
}

return 0;
}
}

void initializeLists(Node* head, Node* Arraylist[], int MAX_INDEX) {

int idx;
int num;

for (idx = 0; idx < MAX_INDEX; idx++) { //pour chaque liste du tableau.
Node* newNode = new Node; //créer un nouveau noeud.
Arraylist[idx] = newNode; //affecter ce noeud à un indice du tableau.
head = newNode; //affecter ce noeud à la tete de la liste.
newNode->nextNode = NULL; //initialiser à null.
newNode->prevNode = NULL; //initialiser à null.
newNode->num = num; //donner la valeur initial de la tete de chaque liste.

}
return;
}

void addNode(int num, int arrayIndex, Node* Arraylist[], int countArray[]) {

int MAX_INDEX;
for (arrayIndex = 0; arrayIndex < MAX_INDEX; arrayIndex++) {
Node* newNode = new Node; //créer un nouveau noeud.
Node* head = Arraylist[arrayIndex]; //affecter la tete de la liste à chaque case du tableau

if (head->num == NULL) {

head->num = num;

}
else {


newNode->nextNode = head->nextNode; // inserer un noeud à une liste.
head->nextNode = newNode;
newNode->prevNode = head;


if (newNode->nextNode != NULL) {
newNode->nextNode->nextNode = newNode;
}
newNode->num = num;
}
countArray[arrayIndex]++; //incrementer le compteur de la liste.
}
return;
}

void affiche_apres_initialisation (Node *p, Node* Arraylist[])
{

int MAX_INDEX(5);

for (int idx = 0; idx < MAX_INDEX; idx++){
while (p != NULL){
cout << Arraylist[idx]->num << endl ;
p = p->nextNode;
p = p->prevNode;
}
}
}

void affiche_apres_ajout (Node *ptr, Node* Arraylist[])
{
int arrayIndex (5);

while (ptr != NULL){
cout << ptr->num << endl << endl;
Arraylist[arrayIndex]->nextNode;
ptr = ptr->nextNode;
ptr = ptr->prevNode;
}
}
0
zarganomi Messages postés 30 Date d'inscription   Statut Membre Dernière intervention  
 
gravgun, Flexy4, yougy2, pouvez vous m'aider SVP ? j'ai vérifié et je n'ai pas détecté ou est l'erreur dans les fonctions !
0
sambia39 Messages postés 610 Date d'inscription   Statut Membre Dernière intervention   49
 
Bonjour je vais probablement faire du hors sujet sur un forum C++ je m'en excuse d'avance mais, comme je vois qu'il a du mal à comprendre certains mécanismes, je vais donc proposer une approche en langage C pour représenter à peu près son schéma et surtout son exercice.
Ton conteneur doit jouer le rôle d'un tableau de pointeur, en résumé c'est un moyen économique de référencer tout l'ensemble de tes listes en une seule structure afin de les manipule aisément.
Pour que tu puisses comprendre ce que j'avance je poste le code en langage C ci-dessous
bien entendu j'invite les expert à me corrigé si j'ai émis des erreurs.
Cordialement

#include <stdio.h>
#include <stdlib.h>

/* Macro Bool */
typedef enum{false,true}bool;

/***
* Structure Simple d'une Pile
***/
typedef struct _Pile{
	
	unsigned int iVal;
 	struct _Pile *pPrec;
}ts_Pile;

/***
*	Fonction vérification 
*   de la pile
***/
bool f_isEmpty(ts_Pile **pIn){
	
	return ( (*pIn == NULL ) ? true : false );
}

/***
* Fonction qui ajoute un élement
* dans la Pile
***/
void f_addPile(ts_Pile **pIn, unsigned int const iVal){
	
	ts_Pile *tmp = malloc( sizeof( ts_Pile ) );
 	if( !tmp ){
  		perror( "Erreur interne d'allocation\n" );
  		exit( 1 );
 	}
	
	/*	Ajout de l'élément	*/
 	tmp->iVal = iVal;
 	tmp->pPrec = *pIn;
 	*pIn = tmp;
}

/***
* fonction qui retire un élement
* de la Pile
***/
unsigned const int f_PopPile(ts_Pile **pIn){
	
	unsigned int iVal = 0;
 	
 	ts_Pile *tmp = NULL;
 	if( !*pIn  )
  		return ( -1 );
 	
 	tmp  = (*pIn)->pPrec;
 	iVal = (*pIn)->iVal;
 	
 	free( *pIn );
 	*pIn = tmp;
 	
 	return ( iVal );
}

/***
* Fonction qui libère
* la mémoire allouer
***/
void f_FreeAlloc( ts_Pile **pIn){
	
	ts_Pile *tmp = NULL;
	
	if( f_isEmpty( pIn ) != true ){
		
		while( *pIn ){
			tmp = (*pIn)->pPrec;
			free ( *pIn );
			*pIn = tmp;
		}
	
		*pIn = NULL;
		tmp = NULL;
	}
}


/***
* Fonction principale
***/
int main( void ) {
	
	int i = 0;	
	
	/* Déclaration des piles & initialisation */
	
 	ts_Pile *pile_1 = NULL;	/*	Pile (1)	*/
 	ts_Pile *pile_2 = NULL;	/*	Pile (2) 	*/
 	ts_Pile *pile_3 = NULL;	/*	Pile (3)	*/
 	
 	/*	tableau de Pointeur */
 	ts_Pile (*pTabAddr[3]) = { &pile_1, &pile_2, &pile_3 };
 	
 	/*	Ajouts des valeurs à la pile	*/
 	for(; i < 20 ; i++){
 		f_addPile(	pTabAddr[0], i );
 		f_addPile(	pTabAddr[1], (i*2) );
 		f_addPile( 	pTabAddr[2], (i*4) );
 	}
 	
 	/*	Affichage des Piles	*/
 	for(i = 0; i < 20 ; i++)
 		printf("Pile (1)\t= %d\n", f_PopPile(&pile_1) );
 		
 	for(i = 0; i < 20 ; i++)
 		printf("Pile (2)\t= %d\n", f_PopPile(&pile_2) );

 	for(i = 0; i < 20 ; i++)
 		printf("Pile (3)\t= %d\n", f_PopPile(&pile_3) );
 	
 	/*	Désalocation mémoire */
 	f_FreeAlloc( pTabAddr[0] );
 	f_FreeAlloc( pTabAddr[1] );
 	f_FreeAlloc( pTabAddr[2] );
 

 	return ( 0 );
}

0
ElementW Messages postés 4814 Date d'inscription   Statut Contributeur Dernière intervention   1 223
 
Tu est moins a coté de la plaque que tu ne le penses: il a dit C++ mais n'utilise rien des conteneurs de la STL et préfère implémenter sa liste lui même (donc bugs garantis ;) ), de même son code n'utilise pas grandement les fonctionnalités du C++
0
sambia39 Messages postés 610 Date d'inscription   Statut Membre Dernière intervention   49
 
Oui, mais bon il a un peu du mal donc j'ai opté pour le langage C et on plus je me suis littéralement cracké (https://forums.commentcamarche.net/forum/affich-30519286-ecrasement-d-adresse#3) sur mon premier poste j'avais des doutes sur mon tableau de pointeur sans compter que j'ai été incapable d'installer un compilateur sur MAC (-_-)
Cependant, s'il n'a pas compris les principes des conteneur et pointeur il n'avancera pas tellement
à bientôt
0