Liste chaînée c sharp [Résolu]

Messages postés
7
Date d'inscription
vendredi 22 août 2008
Dernière intervention
21 décembre 2009
- - Dernière réponse : bab2526
Messages postés
7
Date d'inscription
vendredi 22 août 2008
Dernière intervention
21 décembre 2009
- 8 déc. 2009 à 14:43
Bonjour à tous.
Je suis une totale débutante en C#, débutante en développement.
Je dois faire une liste chaînée (hier, je ne savais même pas que ça existait !), je ne sais pas par où commencer.
Quelqu'un peut-il m'aider (sans me donner un lien du type http://www.csharpfr.com/forum/sujet-CSHARP-LISTE-CHAINEE_733638.aspx que je n'ai pas su utiliser) ?

Merci.
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
Messages postés
1863
Date d'inscription
lundi 28 novembre 2005
Dernière intervention
14 février 2015
3
Merci
Salut

Tout d'abord, sache qu'il existe la classe List<TonType> qui marche très bien :

// Création
List maListe = new List();

// Ajout d'élément
maListe.Add(10);

// Connaître le nombre d'élements
int nb = maListe.Count;

// Lire un élément
int monElement = maListe[0];

// Parcourir ta liste avec for
for (int i = 0; i < maListe.Count; i++)
{
    Console.WriteLine(maListe[i].ToString());
}

// Parcourir ta liste avec foreach
foreach (int monElement in maListe)
{
    Console.WriteLine(monElement);
}


Bon, je ne vais pas non plus te détailler tous les membres de la classe. MSDN est là pour ça.

Si cependant tu souhaites faire toi-même ta liste chainée, tu peux faire un truc du genre :
class Maillon
{
    private Maillon _suivant = null;
    private object _donnees = null;

    public Maillon Suivant
    {
        get { return _suivant; }
        set { _suivant = value; }
    }
    public object Donnees
    {
        get { return _donnees; }
        set { _donnees = value; }
    }
}

class ListeChainee
{
    private Maillon _ancre = null;

    public void AjouterEnDebutDeChaine(object valeur)
    {
        Maillon m = new Maillon();
        m.Donnees = valeur;
        m.Suivant = _ancre;
        _ancre = m;
    }

    public int Compter()
    {
        Maillon m = _ancre;
        int i;
        for (i = 0; m != null; i++) m = m.Suivant;
        return i;
    }

    public object RecupererValeur(int n)
    {
        Maillon m = _ancre;
        for (int i = 0; i < n; i++)
        {
            if(m !null) m m.Suivant;
            else break;
        }
        if(m == null) throw new IndexOutOfRangeException();
        return m.Donnees;
    }
}


Bien sûr, il faut bien maîtriser le concept des listes chainées et celui des références (puisque les pointeurs ne sont pas présents en C#).

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé ! -

Merci krimog 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de krimog
Messages postés
1863
Date d'inscription
lundi 28 novembre 2005
Dernière intervention
14 février 2015
3
Merci
En ce qui concerne l'attribution de la valeur à un maillon, tu la vois dans la méthode AjouterEnDebutDeChaine(). Je lui passe une valeur, puis je la mets dans la propriété "Donnees" de mon Maillon, que j'ajoute à la liste.

Comme je le dis à la fin de mon message, le C# n'utilise pas de pointeurs, mais des références. En fait, une référence, a en gros le même fonctionnement qu'un pointeur, mais l'utilisation d'un variable.
Toute classe est un type par référence.
Toute structure est un type par valeur.

Un type par référence peut avoir la valeur null et nécessite un new pour créer une nouvelle instance.

Maillon est une classe => référence.
Donc, pour simplifier à chaque fois que tu parles d'un Maillon, tu parles en fait d'un pointeur vers un Maillon.

Donc quand je fais :
m.Suivant = _ancre;
_ancre = m;

tu peux considérer que m, m.Suivant et _ancre sont des pointeurs vers des maillons.

Je rappelle également que je n'ai fait que quelques méthodes. Il faudra en faire bien plus pour que ta classe soit réellement utilisable (exemple : modifier la valeur d'un maillon, supprimer un maillon, insérer un maillon à tel endroit, trier ta liste...)

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé ! -

Merci krimog 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de krimog
Messages postés
7
Date d'inscription
vendredi 22 août 2008
Dernière intervention
21 décembre 2009
3
Merci
Encore merci, Krimog, je vais essayer ça.

Bidou, avant d'utiliser des outils tout faits, j'essaye d'apprendre ; mais merci de t'être penché sur mon cas.

Merci bab2526 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de bab2526
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
1
Merci
Et LinkedList<T> ?


[hr]
-Blog-
-Site Perso-
Commenter la réponse de cs_Bidou
Messages postés
7
Date d'inscription
vendredi 22 août 2008
Dernière intervention
21 décembre 2009
0
Merci
Merci Krimog pour ta réponse rapide.
Je préfère faire moi-même la liste chaînée puisque c'est dans un but d'apprentissage.
Cependant ce que tu écris est très obscur pour moi.
Par exemple : comment je fais pour attribuer une valeur au maillon ? Et de quelle façon pointe-t-il sur le suivant ?
Commenter la réponse de bab2526

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.