Gestion des liste chainées

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

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.