Gestion des liste chainées

Soyez le premier à donner votre avis sur cette source.

Snippet vu 6 802 fois - Téléchargée 32 fois

Contenu du snippet

Petit source fournissant plusieurs fonctions permettant de gérer les listes chainées simples.
Ca peut toujours etre utile.

Source / Exemple :


// Auteur : nicof31@everyday.com
// But    : - Montrer comment fonctionnent les listes simplement chainees
//         - Offrir un set de fonctions reutilisables ou facilement adaptables pour d'autres programmes

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h> // a enlever selon le compilateur utilise (necessaire sous VC++)

///////////////////////////////////
// Definition d'un maillon de liste
///////////////////////////////////
typedef struct tag_link
{
  int              data;
  struct tag_link  *next;
} LINK;

//////////////////////
// Initialise la liste
//////////////////////
void Init(LINK *list)
{
  list->next = NULL;
}

////////////////////////////////////
// Ajoute un maillon en fin de liste
////////////////////////////////////
void Add(LINK *list, int data)
{
  LINK  *next_link;

  next_link = list;
  while(next_link->next)
  {
    next_link = next_link->next;
  }

  next_link->next = malloc(sizeof(LINK));

  (next_link->next)->data = data;
  (next_link->next)->next = NULL;
}

//////////////////////////////////
// Insere un maillon dans la liste
//////////////////////////////////
int Insert(LINK *list, int pos, int data)
{
  LINK  *next_link, *sav_link;
  int   i;

  next_link = list;
  i = 0;
  while(next_link->next && i < pos-1)
  {
    next_link = next_link->next;
    i++;
  }

  if(i == pos-1)
  {
    sav_link = next_link->next;
    next_link->next = malloc(sizeof(LINK));
    (next_link->next)->data = data;
    (next_link->next)->next = sav_link;

    return 1;
  }
  else
  {
    return 0;
  }
}

/////////////////////////////////
// Detruit un maillon de la liste
/////////////////////////////////
int Delete(LINK *list, int pos)
{
  LINK  *next_link, *sav_link;
  int   i;
  
  
  next_link = list;
  i = 0;
  while(next_link->next && i < pos-1)
  {
    next_link = next_link->next;
    i++;
  }

  if(i == pos-1)
  {
    sav_link = (next_link->next)->next;
    free(next_link->next);
    next_link->next = sav_link;

    return 1;
  }
  else
  {
    return 0;
  }
}

/////////////////////////////////////////
// Libere la memoire allouee par la liste
/////////////////////////////////////////
void Free(LINK *list)
{
  LINK  *next_link, *next2_link;

  
  next2_link = list->next;

  while(next2_link)
  {
    next_link = next2_link;
    next2_link = next_link->next;
    free(next_link);
  }

  list->next = NULL;
}

//////////////////////////////////////////////////
// Affiche le nb de maillons que contient la liste
//////////////////////////////////////////////////
int Count(LINK *list)
{
  LINK  *next_link;
  int   i;

  next_link = list;
  i = 0;
  while(next_link->next)
  {
    next_link = next_link->next;
    i++;
  }

  return i;
}

///////////////////////////////////
// Affiche les elements de la liste
///////////////////////////////////
void Print(LINK *list)
{
  LINK  *next_link;
  int   i;

  next_link = list;
  i = 0;
  while(next_link->next)
  {
    next_link = next_link->next;
    printf("Maillon %d : %d\n", ++i, next_link->data);
  }

  printf("\n");
}

//////////////////////
// Fonction principale
//////////////////////
int main(void)
{
  LINK  list;
  int   i;

  // Initialisation de la liste
  Init(&list);

  // On remplit la liste (ajouts d'elements en fin de liste)
  for(i = 0; i < 5; i++)
  {
    Add(&list, 2*i);
  }
  Print(&list);

  // Insertion d'un element en milieu de liste
  Insert(&list, 4, -20);
  Print(&list);

  // Suppression d'un element en milieu de liste
  Delete(&list, 2);
  Print(&list);

  // Compte et affiche le nombre d'elements que contient la liste
  printf("La liste comporte %d elements\n", Count(&list));

  // Libere la memoire allouee pour les elements de la liste
  Free(&list);

  return 1;
}

A voir également

Ajouter un commentaire Commentaires
Messages postés
92
Date d'inscription
dimanche 2 juin 2002
Statut
Membre
Dernière intervention
24 juin 2004

Listes chainées, arbres, graphes, tout ça va dans algo et toutes les calculettes/traceur de fonctions/outils mathématiques pareil
Messages postés
3006
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
31 décembre 2008

ok merci pr la confirmation NiFF.
qu'est-ce qui va ds math et algo? les listes chaînées?
Messages postés
92
Date d'inscription
dimanche 2 juin 2002
Statut
Membre
Dernière intervention
24 juin 2004

oui avec void* on pointe vers ce qu'on veut comme données, c'est la meilleure solution.
C'est Maths et Algorithmes la catégorie.
Messages postés
3006
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
31 décembre 2008

ah vi mais la structure tag_mesdonnées je la crée pour l'occasion alors? parce que je sais qu'il y a moyen de généraliser directement, je pense en mettant void* comme type de données, on pourrait mettre ce qu'on veut dedans. je ne sais pas trop, j'ai vu ça qq part. ce que tu me proposes n'est pas très pratique, ou bien j'ai pas compris, parce qu'il suffirait de changer la déclaration de int data vers TypeVoulu data directement. enfin j'ai peut etre pas compris :-)
Messages postés
16
Date d'inscription
mercredi 18 juillet 2001
Statut
Membre
Dernière intervention
15 juillet 2003

une petite idee qui me passe par la tete (faudrait essayer) :
tu definis LINK comme ceci:
typedef struct {
struct tag_mesdonnees data;
struct tag_link *next;
} LINK;

ca doit regler le pb dont tu me parles.
Afficher les 6 commentaires

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.