Rechercher : dans
Par :

Programme de liste chainée

Dernière réponse le 19 mai 2008 à 17:36:23 mimi1234, le 17 mai 2008 à 18:05:08 
 Signaler ce message aux modérateurs

Bonjour tout le monde.est ce que vous pouvez m aider pour faire un programme des listes chainées........ajouter dans une liste au debut,a la fin,au milieu et supprimer....merci

Configuration: Windows XP
Internet Explorer 6.0

Meilleures réponses pour « programme de liste chainée » dans :
Liste simplement chaînée VoirLISTES SIMPLEMENT CHAINÉES Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la liste IV. Opérations sur les listes chaînées A. Initialisation B. Insertion d'un élément dans la liste 1. Insertion...
Liste doublement chaînée VoirLISTES DOUBLEMENT CHAINÉES Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la liste IV. Opérations sur les listes doublement chaînées A. Initialisation B. Insertion d'un élément dans la liste 1....
Désactiver l'exécution de certains programmes au démarrage VoirDésactiver l'exécution de certains programmes au démarrage - Windows 98/Me/2000/XP/Vista Avec msconfig Avec WinPatrol Avec Startuplite Avec CCleaner Remarques Lorsque vous installez des logiciels, certains s'exécutent à chaque...
Langage C - Les listes chaînées VoirLa notion de structure autoréferrentielle Une structure autoréferrentielle (parfois appelée structure récursive) correspond à une structure dont au moins un des champs contient un pointeur vers une structure de même type. De cette façon on crée...

1

daronmaster, le 17 mai 2008 à 20:22:43

Est-ce que ce .h te conviendrait ?

j'ai l'âme charitable :


#ifndef LISTE_H
#define LISTE_H

/*----------------------------------------------------------­---*
 |							       |	
 |   Module de creation/gestion d'une liste generique(void *)  |
 |							       |
 *-----------------------------------------------------------­--*/



typedef struct TCell{

	void *cell;

	struct TCell *next;

	struct TCell *previous;

}TCell;


typedef struct{

	TCell *begin;

	TCell *end;

	TCell *iterator;

	int sizeElt;

	int length;

	int posIterator;

}TList;

TList * TListCreate(int sizeElt);		//creation d'une liste

TList * TListCreateCopy(const TList *l);	//creation d'une liste par copie

void TListDelete(TList **l);			//destruction d'une liste

void pushBegin(TList *l,const void *elt);      	//ajout en debut de liste

void pushEnd(TList *l,const void *elt);  	//ajout en fin de liste

void pushIterator(TList *l,const void *elt);  	//ajout au niveau de l'iterator

void * topBegin(const TList *l);		//renvoie sans suppression l'elt de debut de liste

void * topEnd(const TList *l);			//renvoie sans suppression l'elt en fin de liste

void * topIterator(const TList *l);		//renvoie sans suppression l'elt au niveau de l'iterator

void * popBegin(TList *l);                	//suppression en debut de liste

void * popEnd(TList *l);		   	//suppression en fin de liste

void * popIterator(TList *l);		   	//suppression au niveau de l'iterator

void nextIterator(TList *l);		   	//incrementation de l'iterateur

void previousIterator(TList *l);	   	//decrementation de l'iterateur

void iteratorAtBegin(TList *l);			//iterateur au debut

int getPositionIterator(const TList *l);	//getteur position de l'iterateur

void setPositionIterator(TList *l, int indice);	//setteur position de l'iterateur

int getSizeElt(const TList *l);		   	//taille des elements

int getLength(const TList *l);			//taille de la liste

int isEmpty(const TList *l);			//liste vide ?

int isIteratorBegin(const TList *l);		//iterateur au debut ?

int isIteratorEnd(const TList *l);		//iterateur a la fin ?

void ** listToArray(const TList *l);			//liste vers tableau

void arrayDelete(void **tab);			//destruction du tableau


#endif 

Répondre à daronmaster

3

Ipsec, le 17 mai 2008 à 21:07:11

J'aurai bien rajouté a cette interface une fonction definissant la façon de liberer la liste:
void definir_liberation_liste(TList self, void (*liberer)(void*));
ou a la creation:
TList * TListCreate(int sizeElt, void (*liberer)(void*));

En modifiant bien sur la structure en conséquence.
Peut etre meme faire la meme chose pour une fonction d'affichage et pourquoi pas une fonction de comparaison ;)

Répondre à Ipsec

6

mimi1234, le 18 mai 2008 à 21:04:41

Merci en tout les cas.mais ce que tu m as donnée ce n est pas les morceaux de code.......

Répondre à mimi1234

7

 Ipsec, le 19 mai 2008 à 17:36:23

Tu peut modifier ta structure comme sa:

typedef struct TCell{

	void *cell;

	struct TCell *next;

	struct TCell *previous;

}*TCell;
typedef struct{

	TCell *begin;

	TCell *end;

	TCell *iterator;

//Ces lignes semblent en trop
/*	int sizeElt;

	int length;

	int posIterator;*/

       void (*liberer)(void*);
       void (*afficher)(void*);
       void (*comparer)(void*,void*);

}*TList;


Et par exemple la creation pourrai etre:
//la taille(sizeElt) d'une liste simplement chainée ou doublement n'est pas utile si tu n'utilise pas de tableau pour les crées
TList * TListCreate(/*int sizeElt, */void (*liberer)(void*),void (*comparer)(void*,void*)){
     TList * self = malloc(sizeof(*self));
     if(self == NULL){
        perror(malloc());
        exit(errno);
    }
    self->begin = NULL;
    self->end = NULL;
    self->iterator = NULL;
    self->liberer = liberer;
    self->comparer = comparer;
    self->afficher = NULL;
//Ces lignes me semblent superflus
/*    self->sizeElt = sizeElt;
    self->length = 0;
    self->posIterator = -1;*/

    return self;
}


Et pour l'insertion tu aurai un truc du genre:
//Ici je ne tient pas compte de la comparaison mais on peu la rajouter pour avoir par exemple une liste ordonnée
void pushEnd(TList *l,const void *elt){
    TCell *tmp = malloc(sizeof(*tmp));
    if(tmp == NULL){
       perror(malloc());
       exit(errno);
    }
    tmp->cell = elt;
    tmp->previous = l->end;
    tmp->next = NULL;
    l->end = tmp;
}


Et par exemple pour l'affichage on aurai:
void afficher_liste(TList * self){
      if(self->afficher != NULL){
          for(TCell *tmp = self->begin ;tmp!=NULL; tmp = tmp->next)
              self->afficher(tmp->cell);
     }
}

Apres a chacun sa vision des choses.
Voilu ;)

Répondre à Ipsec

2

daronmaster, le 17 mai 2008 à 20:27:20

Ceci n'est que le point te permettant d'avoir un aperçu de ce que tu dois faire.
Je pense que c'est à toi de coder le reste, et si tu as besoin d'aide n'hesite pas mais code avant et mets ton code ppur voir ce qui ne va pas.

bon courage

Répondre à daronmaster

4

lami20j, le 17 mai 2008 à 21:13:57

Salut,

tu peux regarder dans la FAQ

liste simplement chaînée
liste doublement chaînée 106485010510997108

Répondre à lami20j

5

mimi1234, le 18 mai 2008 à 20:59:47

Merci de ton aide

Répondre à mimi1234
Collection CommentÇaMarche.net