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;
}
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.