Implémentation des listes doublement chaînées par tableaux !

Fermé
dx3d Messages postés 68 Date d'inscription dimanche 6 septembre 2009 Statut Membre Dernière intervention 19 juillet 2017 - 9 mai 2014 à 18:33
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 10 mai 2014 à 21:33
Bonjour,
Je me demandais si il était possible de faire une implémentation des listes doublement chaînées par tableaux multiple(ou unique) sans l'aide des pointeurs !

4 réponses

jerome9359 Messages postés 693 Date d'inscription mercredi 4 février 2009 Statut Membre Dernière intervention 10 juin 2019 159
9 mai 2014 à 18:41
oui c'est possible mais ça va être dur d'ajouter ou d'enlever des éléments de la liste... Le tableau en C est de taille fixe. Il Faut utiliser des structure de donné
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
10 mai 2014 à 00:34
Bonjour,
Au pire, tu peux utiliser de l'allocation dynamique. Tu peux réallouer la zone avec realloc().
Mais bon, cela ne s'appelle pas implémenter une liste doublement chaînée ;-))).

Cdlt,
0
dx3d Messages postés 68 Date d'inscription dimanche 6 septembre 2009 Statut Membre Dernière intervention 19 juillet 2017
10 mai 2014 à 16:28
@fiddy : Donc déjà désolé pour le manque d'information que j'ai donné, donc pour mieux m'expliquer :
Dans notre TP on nous dit qu'on ne dispose pas de pointeur qu'on va devoir simuler les pointeurs par des indices dans des tableaux. On nous demande donc de proposer une implémentation des listes doublement chainées par tableaux multiples. et par la suite en nous inspirant du fait que les objets sont stockés de façon contigüe dans la plupart des langages de programmation et qu'un pointeur dans un tel objet est l'adresse du premier mot de proposer une autre implémentation en utilisant un tableau unique.
Et ce n'est que dans l'exercice suivant qu'on nous demande de crée des fonctions d'allocation et de libération de mémoire.

Donc déjà je m'étais dis que pour le tableau unique, avec des fonctions suivant/precedent je pourrais le parcourir pareil que pour une liste doublement chainées :

suivant -> si l'indice du tableau i < sizeof(tab)-1, on retourne tab[i+1] sinon on retourne tab[0]

precedent -> si l'indice du tableau i>0, on retourne tab[i-1] sinon on retourne tab[sizeof(tab)-1]

mais je ne vois pas vraiment pourquoi utiliser plusieurs tableaux du coup ( ou plutôt je n'en vois pas l'utilité ... )
Est ce que je me goure ou est ce qu'il me manque un truc? Tout avis est le bienvenu, si besoin je peux link le TP si mes explications ne sont pas claire ! :)
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
10 mai 2014 à 21:04
suivant -> si l'indice du tableau i < sizeof(tab)-1, on retourne tab[i+1] sinon on retourne tab[0]
Ce n'est pas i<sizeof(tab)-1 qu'il faut tester, mais i<sizeof(tab)/sizeof(*tab) - 1 (pour info les parenthèses sont facultatives).
De même pour précédent.

Sinon pour l'utilisation de multiples tableaux, c'est peut-être lorsque le tableau est plein. Non ?
0
dx3d Messages postés 68 Date d'inscription dimanche 6 septembre 2009 Statut Membre Dernière intervention 19 juillet 2017
10 mai 2014 à 21:19
J'ai pensé pour les tableaux multiple à faire :

int suivant(int VAL[], int IND[],int depart){
int i ;
printf("Valeur actuel : %d",VAL[depart]);
i = IND[depart];
depart=i;
printf("\nProchain indice : %d\n",depart);
return depart;

}

int main(){

int tabVAL[8]={1,4,15,31,23,6,11,3};
int tabIND[8]={7,5,6,0,2,3,1,4};
int start = 2;
start=suivant(tabVAL, tabIND, start);
start=suivant(tabVAL, tabIND, start);
}


En gros on prend une valeur de départ ici c'est 2, donc on commence avec
tabVAL[2]=15, on voit l'indice dans la tabIND associé et on trouve que tabIND[2]=6, donc l'élément suivant sera tabVAL[6]=11, et ainsi de suite, donc je me retrouve bien avec ma fonction suivant qui renvoie l'élément suivant de la liste ( c'est un peu bordélique à la lecture mais bon ça marche et la boucle marche bien, une fois qu'il passe tous les éléments il revient bien à l'élément de départ et ça continue, je suis entrain de faire la fonction precedent maintenant.

Et sinon pour la correction que tu m'as donné, ça risque d'être compliqué vu que je n'ai pas le droit aux pointeurs. (Notre prof est sadique ... )
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
10 mai 2014 à 21:33
Par contre, je ne comprends pas pourquoi tu utilises tabIND ? Tu ne peux pas dire simplement que l'élément suivant est i+1 ?

Et sinon pour la correction que tu m'as donné, ça risque d'être compliqué vu que je n'ai pas le droit aux pointeurs.
Hum. Dès lors que tu fais tab[i], tu utilises un pointeur sans le savoir. tab[i] est l'équivalent de *(tab+5)... Le prof ne veut pas d'allocations dynamiques je pense. Enfin si l'étoile te gêne, tu peux utiliser : sizeof tab / sizeof tab[0] ;-)
0