Supprime le 1er elemnt de la liste en C

Fermé
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 - 6 juil. 2008 à 12:00
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 6 juil. 2008 à 22:26
Bonjour,
je programme en C,e et je rencontre un probleme :
quelqun peut m'aider à developper une fonction qui supprime le 1er elemnt de la liste( table dehachage)
je sais pas faire pour supprimer le 1er elemnt dela liste chaine

typedef struct c{
	int pos;
	int nl;
	struct c *suivant;
}Coordonnees;
 
typedef struct L{
	char mot[50];
	Coordonnees *c;
	struct L *suivant;
}Liste;


merci

5 réponses

Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 193
6 juil. 2008 à 12:11
tu fais c=c->suivant
ou L*l->suivant

attention, ceci ne désaloura pas la memoire, pour desalouer la memoire, utilises une variable temporaire
L maliste

L *temp=maliste->suivant;
delete L;
maliste=temp
0
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
6 juil. 2008 à 12:16
merci Nabla's , mais c'est pas clair.
jai une table de hachage qui en fait une liste chainée.
SVP tu peux me réecrire le code plus lisible avec la desallocation mémoire.
merci
0
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 193
6 juil. 2008 à 17:48
je vais te l expliquer avec des mots, ce sera plus simple.

ta liste chainée est composée de maillons. toi tu veux supprimer le premier maillon de la chaine.
tu as un pointeur qui pointe sur ton premier maillon, puis le premier pointe sur le deuxieme, etc...

tu crée un pointeur, du meme type que les maillons de ta chaine (si c est une chaine de coordonnées, tu fais un pointeur que tu apelles temp, de types coordonnées*. Ca donne "coordonnées *temp".

tu donne a ce pointeur la valeur de ton premier maillon:
temp=premiermaillon (attention, sans etoiles, car te ne copies pas du contenu, mais les adresse memoires !!!

ensuite, tu deplace ton pôinteur qui indiquait l emplacement de ton premier maillon vers le deuxime maillon.

genre: machaine=machaine->next;
donc ta liste chainée commence maintenant au 2 eme maillon, plus rien ne pointe sur le premier maillon dans la chaine. Il ne te reste plus que le maillon temp qui sais ou sotn ces données.

ensuite tu invoque la suppression de données. En c+ c'est delete pour desalouer la memoire. En C, c'est free(temp)

voila. J estpere que le commentire est plus clair que du code.
0
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
6 juil. 2008 à 17:58
merci Nabla.
mais là avec mon code je confonds,
include <stdlib.h>
#include <string.h>
 
#include "table_hash.h"
#define TAILLEHASH 307
 
 
int main(void)
{
 
  // Declaration des variables 
 int a;
  FILE *F;              // Descripteur du fichier texte
  char mot[100];        // variable utilisée pour stocker le mot en cours de lecture
  int i;                // variable utilisée lors du parcours de la TableHash
  unsigned int cle,pt;  // variables pour stocker les cles du mot en cours et la clé du caractère '.'
  char *temp;		// variable pour stocker le mot en cours de lecture
  char c;               // ??
  Liste **TableHash;    // tableau de liste
  TableHash = (Liste **) malloc (TAILLEHASH * sizeof(Liste *)); // allocation en memoire du tableau
  for(i=0;i<TAILLEHASH;++i) //  Initialisation des
    TableHash[i] = NULL;   


je c pas comment faire
?
un tableau ????????, une liste ?????????
je confonds.
merci de m'aider
0
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
6 juil. 2008 à 18:16
Salut à tous,
Jai un probleme qui me bloque:
jai une table de hachage chainé: un tableau de liste chainé
#ifndef TABLE_HASH
#define TABLE_HASH
 
typedef struct c{
	int pos;
	int nl;
	struct c *suivant;
}Coordonnees;
 
typedef struct L{
	char mot[50];
	Coordonnees *c;
	struct L *suivant;
}Liste;


voilà sa declaration :
Liste **TableHash;    // tableau de liste
  TableHash = (Liste **) malloc (TAILLEHASH * sizeof(Liste *)); // allocation en memoire du tableau
  for(i=0;i<TAILLEHASH;++i) //  Initialisation des
    TableHash[i] = NULL;    //  pointeurs contenus dans le tableau 


bon je possede aussi d'une liste qui contient les séquence des mots (la table de hachage contient les mot, ainsi leurs coordonnées).
Bon jai une fonction elaguer2seq: dui parcoure la table de hachage, aisi la liste des séquence, et verfief si chaque mot de la liste est inclus dans la séquencedes mots et est cequil ets bien le dernier mot de l'ensemble desmots qui constituent la sequencedes mots.
cette fonction de verification c'est la fonction "chercher_mot" qui renvoie la valeur 1 si le motverifie bien la condition.
si le mots verifie la fonction: il est inclus dans la séquence des mots etquil est à la derniere position, on le supprime de la table de hachage.
Ben moi je bloque danns cette fonction de suppression dela table, comment faire?????????
Aidez moi SVP
je comptesur vous.merci

void elaguer2seq(Liste *L, Liste **TableHash)
{
  Liste *p;
  Liste *q;
  char *mot;
  int i=0;
  int a;
  printf(" seq : %s\n",L->mot);
//printf("TableHash : %s\n",TableHash[1]->mot);
for ( i=0;i<TAILLEHASH;i++)
{
    for(p=L;p!=NULL;p=p->suivant){
 if(TableHash[i] != NULL)
   //printf("TableHash : %s\n",TableHash[i]->mot);
         if  (chercher_mot(TableHash[i]->mot,p->mot)==0)
         printf("%s","condition vérifiée");
          free(TableHash[i]) ;// supprimer mot  
          i=i++;
   // supprimerMot(p->mot);  
      AfficherTableHash(TableHash);
}
}
0
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 193
6 juil. 2008 à 18:15
Liste *maillon_temp;

maillon_temp=TableHash[i];
TableHash[i]=TableHash[i]->suivant
Free(maillon_temp);


pour inffo, le code que tu m a donné ne remplie pas la liste chainée.. il faudra donc la remplir ;)
0
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
6 juil. 2008 à 18:17
Salut Nabla's,
Jai un probleme qui me bloque:
jai une table de hachage chainé: un tableau de liste chainé
#ifndef TABLE_HASH
#define TABLE_HASH
 
typedef struct c{
	int pos;
	int nl;
	struct c *suivant;
}Coordonnees;
 
typedef struct L{
	char mot[50];
	Coordonnees *c;
	struct L *suivant;
}Liste;

voilà sa declaration : 
Liste **TableHash;    // tableau de liste
  TableHash = (Liste **) malloc (TAILLEHASH * sizeof(Liste *)); // allocation en memoire du tableau
  for(i=0;i<TAILLEHASH;++i) //  Initialisation des
    TableHash[i] = NULL;    //  pointeurs contenus dans le tableau 


bon je possede aussi d'une liste qui contient les séquence des mots (la table de hachage contient les mot, ainsi leurs coordonnées).
Bon jai une fonction elaguer2seq: dui parcoure la table de hachage, aisi la liste des séquence, et verfief si chaque mot de la liste est inclus dans la séquencedes mots et est cequil ets bien le dernier mot de l'ensemble desmots qui constituent la sequencedes mots.
cette fonction de verification c'est la fonction "chercher_mot" qui renvoie la valeur 1 si le motverifie bien la condition.
si le mots verifie la fonction: il est inclus dans la séquence des mots etquil est à la derniere position, on le supprime de la table de hachage.
Ben moi je bloque danns cette fonction de suppression dela table, comment faire?????????
Aidez moi SVP
je comptesur vous.merci

void elaguer2seq(Liste *L, Liste **TableHash)
{
  Liste *p;
  Liste *q;
  char *mot;
  int i=0;
  int a;
  printf(" seq : %s\n",L->mot);
//printf("TableHash : %s\n",TableHash[1]->mot);
for ( i=0;i<TAILLEHASH;i++)
{
    for(p=L;p!=NULL;p=p->suivant){
 if(TableHash[i] != NULL)
   //printf("TableHash : %s\n",TableHash[i]->mot);
         if  (chercher_mot(TableHash[i]->mot,p->mot)==0)
         printf("%s","condition vérifiée");
          free(TableHash[i]) ;// supprimer mot  
          i=i++;
   // supprimerMot(p->mot);  
      AfficherTableHash(TableHash);
}
}
0
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
6 juil. 2008 à 18:23
ca afficheune erreur :
[Linker error] undefined reference to `Free'
0
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 193 > stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009
6 juil. 2008 à 18:35
0
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 193
6 juil. 2008 à 18:26
tu crees un pointeur temporaire pointant sur le maillon a supprimer,
tu prends ton pointeur qui pointe sur le maillon a supprimer, et tu lui dit de se positionner sur maillon->suivant
et ensuite tu fais free(pointeur temporaire)
je suis desolé, si tu comprends pas ce que je dis, c'est peut etre que je m exprimes mal, peut etre que tu ne lis pas avec assez d attention, mais je ne peux faire mieu.

bon courrage
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
6 juil. 2008 à 22:26
Salut,

je sais pas faire pour supprimer le 1er elemnt dela liste chaine
c'est fait pour ;-))
http://www.commentcamarche.net/faq/sujet 7444 liste simplement chainee#1 suppression au debut de la liste
0