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

bab2526 7 Messages postés vendredi 22 août 2008Date d'inscription 21 décembre 2009 Dernière intervention - 8 déc. 2009 à 11:28 - Dernière réponse : bab2526 7 Messages postés vendredi 22 août 2008Date d'inscription 21 décembre 2009 Dernière intervention
- 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 

5 réponses

Répondre au sujet
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 8 déc. 2009 à 11:52
+3
Utile
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é ! -
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de krimog
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 8 déc. 2009 à 14:12
+3
Utile
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é ! -
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de krimog
bab2526 7 Messages postés vendredi 22 août 2008Date d'inscription 21 décembre 2009 Dernière intervention - 8 déc. 2009 à 14:43
+3
Utile
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.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de bab2526
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 8 déc. 2009 à 14:30
+1
Utile
Et LinkedList<T> ?


[hr]
-Blog-
-Site Perso-
Commenter la réponse de cs_Bidou
bab2526 7 Messages postés vendredi 22 août 2008Date d'inscription 21 décembre 2009 Dernière intervention - 8 déc. 2009 à 13:47
0
Utile
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.