• STATISTIQUES
  • Il y a eu un total de 2 membres et 14267 visiteurs sur le site dans les dernières 24h pour un total de 14 269 personnes!


    Membres: 2 433
    Discussions: 3 585
    Messages: 32 832
    Tutoriels: 78
    Téléchargements: 38
    Sites dans l'annuaire: 58


  • ANNUAIRE
  • [EN] This is legal
    Basic: 10, Realistic: 5, Programming: 1, Bonus: 11, SQL: 2, Encryption: 6, Application: 4, User Contributed: 3
    Challenges
    [FR] frameip
    le site de partage des connaissances du monde TCPIP
    Protocole
    [EN] Rankk
    Site de challenge construit sur le principe d'une pyramide à 9 level. Level 1: 60,Level 2: 72,Level 3: 68,Lev...
    Challenges
    [EN] Hack This Site
    Hack This Site est considéré comme un réel terrain d'entraînement légal pour le...
    Hacking
    [EN] phrack
    Lot's of stuff !
    Hacking
    [FR] Hackfest
    Le Hackfest est un évènement de sécurité et de piratage informatique au Québec reg...
    Hacking
    [EN] Reddit
    Subreddit dédié à la sécurité informatique.
    Hacking

  • DONATION
  • Si vous avez trouvé ce site internet utile, nous vous invitons à nous faire un don du montant de votre choix via Paypal. Ce don servira à financer notre hébergement.

    MERCI!




Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
[C] Bibliothèque de gestion des listes doublement chainées
23-09-2012, 12h09 (Modification du message : 19-11-2012, 19h29 par InstinctHack.)
Message : #1
InstinctHack Hors ligne
Posting Freak
*



Messages : 1,366
Sujets : 184
Points: 299
Inscription : Dec 2011
[C] Bibliothèque de gestion des listes doublement chainées
Premier code en C :
Elle seras complété par la suite et suivie d'autres Smile
(je pense améliorer ce code pour gerer une arborescence de fichier, donc des structures de arborescence, de répertoire et de fichier...)
Vive le partage

Code :
#include "../h/listes_chaine_simple.h"

typedef struct Node Node;
struct Node
{
    int nombre;
    Node *p_node_suivant;
    Node *p_node_precedant;
};

typedef struct Liste Liste;
struct Liste
{
    Node *p_node_premier;
    Node *p_node_dernier;
    int longueur;
    char name[100];
};

Liste *listes_chaine_simple_initialisation()
{
    Liste *p_liste = malloc(sizeof(*p_liste));

    if (p_liste == NULL)
    {
        printf("Memoire insuffisante! Fin du programme!");
        exit(EXIT_FAILURE);
    }
    else
    {
        p_liste->longueur=0;
        p_liste->p_node_premier=NULL;
        p_liste->p_node_dernier=NULL;
    }
    return p_liste;
}

void listes_chaine_simple_afficher(Liste *p_liste)
{
    if (p_liste == NULL)
    {
        exit(EXIT_FAILURE);
    }
    else
    {
        Node *p_node_actuel = p_liste->p_node_premier;
        printf("Parcours de la liste de longueur : %d\n",p_liste->longueur);
        while (p_node_actuel != NULL)
        {
                printf("\tA l'adresse %p contient :\n\t\t%p node precedant\n\t\t%p node suivant\n\t\t%d data\n",p_node_actuel,p_node_actuel->p_node_precedant,p_node_actuel->p_node_suivant,p_node_actuel->nombre);
                p_node_actuel = p_node_actuel->p_node_suivant;
        }
        printf("\nFin du parcours\n");
    }
}

void listes_chaine_simple_append(Liste *p_liste,char * position, int nombre)
{
    if (p_liste != NULL) /* On vérifie si notre liste a été allouée */
    {
        Node *p_node_new = malloc(sizeof(*p_node_new));/* Création d'un nouveau node */
        if (p_node_new == NULL) /* On vérifie si le malloc n'a pas échoué */
        {
            exit(EXIT_FAILURE);
        }
        else
        {
            p_node_new->nombre = nombre; /* On 'enregistre' notre donnée */

            if(position=="append"){
                p_node_new->p_node_suivant = NULL; /* On fait pointer p_next vers NULL */
            } else if(position=="prepend"){
                p_node_new->p_node_precedant = NULL; /* On fait pointer p_precedant vers NULL */
            }else    {exit(EXIT_FAILURE);}


            if (p_liste->longueur == 0) /* Cas où notre liste est vide (pointeur vers fin de liste à  NULL) */
            {
                if(position=="append"){
                    p_node_new->p_node_precedant = NULL; /* On fait pointer p_prev vers NULL */
                } else if(position=="prepend"){
                    p_node_new->p_node_suivant = NULL;
                }else    {exit(EXIT_FAILURE);}
                p_liste->p_node_premier = p_node_new; /* On fait pointer la tête de liste vers le nouvel élément */
                p_liste->p_node_dernier = p_node_new; /* On fait pointer la fin de liste vers le nouvel élément */
            }
            else /* Cas où des éléments sont déjà présents dans notre liste */
            {
                if(position=="append"){
                    p_liste->p_node_dernier->p_node_suivant = p_node_new; /* On relie le dernier élément de la liste vers notre nouvel élément (début du chaînage) */
                    p_node_new->p_node_precedant = p_liste->p_node_dernier; /* On fait pointer p_prev vers le dernier élément de la liste */
                    p_liste->p_node_dernier = p_node_new; /* On fait pointer la fin de liste vers notre nouvel élément (fin du chaînage: 3 étapes) */

                } else if(position=="prepend"){
                    p_liste->p_node_premier->p_node_precedant = p_node_new;
                    p_node_new->p_node_suivant = p_liste->p_node_premier;
                    p_liste->p_node_premier = p_node_new;
                }else    {exit(EXIT_FAILURE);}


            }
            p_liste->longueur++; /* Incrémentation de la taille de la liste */
        }
    }
}

void liste_chaine_simple_insert(Liste *p_liste, int position, int nombre)
{
    if (p_liste == NULL)
    {
        exit(EXIT_FAILURE);
    }
    else
    {
        if(position==0)
        {
//            printf("\nfacile prepend!\n");
            listes_chaine_simple_append(p_liste,"prepend",nombre);
        }
        else if(position==((p_liste->longueur)-1))
        {
//            printf("\nfacile append!\n");
            listes_chaine_simple_append(p_liste,"append",nombre);
        }
        else
        {
//            printf("\ndur search :'( \n");
            Node *p_node_temp = p_liste->p_node_premier;/* Création d'un nouveau node */
            int i = 0;
            while (p_node_temp != NULL && i <= position)
            {
                if (position == i)
                {
/*
                    if (p_node_temp->p_node_suivant == NULL)
                    {
                        listes_chaine_simple_append(p_liste,"append",nombre);
                    }
                    else if (p_node_temp->p_node_precedant == NULL)
                    {
                        listes_chaine_simple_append(p_liste,"prepend",nombre);
                    }

                    else
                    {
*/
                        Node *p_node_new = malloc(sizeof(*p_node_new));/* Création d'un nouveau node */
                        if (p_node_new == NULL)
                        {
                            exit(EXIT_FAILURE);
                        }
                        else
                        {
                            p_node_new->nombre = nombre;
                            p_node_temp->p_node_suivant->p_node_precedant = p_node_new;
                            p_node_temp->p_node_precedant->p_node_suivant = p_node_new;
                            p_node_new->p_node_precedant = p_node_temp->p_node_precedant;
                            p_node_new->p_node_suivant = p_node_temp;
                            p_liste->longueur++;
                        }
//                    }
                }
                else
                {
                    p_node_temp = p_node_temp->p_node_suivant;
                }
                i++;
            }
        }
    }
}

void liste_chaine_simple_delete_id(Liste *p_liste,int position)
{
    if (p_liste == NULL)
    {
        exit(EXIT_FAILURE);
    }
    else
    {
        Node *p_node_temp = p_liste->p_node_premier;
        int i = 0;
        while (p_node_temp != NULL && i <= position)
        {
            if (position == i)
            {
                if (p_node_temp->p_node_suivant == NULL && p_node_temp->p_node_precedant == NULL)
                {
                    p_liste->p_node_dernier = NULL;
                    p_liste->p_node_premier = NULL;
                }
                else if (p_node_temp->p_node_suivant == NULL)
                {
                    p_liste->p_node_dernier = p_node_temp->p_node_precedant;
                    p_liste->p_node_dernier->p_node_suivant = NULL;
                }
                else if (p_node_temp->p_node_precedant == NULL)
                {
                    p_liste->p_node_premier = p_node_temp->p_node_suivant;
                    p_liste->p_node_premier->p_node_precedant = NULL;
                }
                else
                {
                    p_node_temp->p_node_suivant->p_node_precedant = p_node_temp->p_node_precedant;
                    p_node_temp->p_node_precedant->p_node_suivant = p_node_temp->p_node_suivant;
                }
                free(p_node_temp);
                p_liste->longueur--;
            }
            else
            {
                p_node_temp = p_node_temp->p_node_suivant;
            }
            i++;
        }
    }
}

void liste_chaine_simple_delete(Liste *p_liste)
{
    while(p_liste->longueur>1)
    {
        liste_chaine_simple_delete_id(p_liste,0);
    }
    free(p_liste);
}
Citation :un jour en cours de java j'ai attrapé les seins d'une fille mais elle m'a frappé en disant "c'est privé !!"
j'ai pas compris pourquoi, je croyais qu'on était dans la même classe
+1 (0) -1 (0) Répondre
23-09-2012, 13h43
Message : #2
supersnail Hors ligne
Éleveur d'ornithorynques
*******



Messages : 1,614
Sujets : 72
Points: 466
Inscription : Jan 2012
RE: bibliothèque de gestion des listes doublement chainées
Hum, en gros t'as fait une sorte de liste doublement chaînée améliorée :p (après je sais pas si ça sert vraiment le champ p_node_dernier de la structure Liste).

Bref, sympa, même si ton post m'a fait rater le leet time :').
Mon blog

Code :
push esp ; dec eax ; inc ebp ; and [edi+0x41],al ; dec ebp ; inc ebp

"VIM est merveilleux" © supersnail
+1 (0) -1 (0) Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)
N-PN
Accueil | Challenges | Tutoriels | Téléchargements | Forum | Retourner en haut