CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Liste chainée en C++ : je bloque

Biskra_
Biskra_
Niveau 4
18 février 2006 à 15:08:24

:salut:
D´abord j´explique le but du programme : créer une liste chainée dont chaque élt contient un entier, une chaine de caractère et un pointeur sur le chainon suivant.

Mon probleme, c ke mon prog ne semble pas bien lire la liste.

Si pouviez me dire ce ki ne va pas, ca m´avancerait bcp.

Voila le prog :

  1. include<stdio.h>
  2. include<stdlib.h>
  3. include <string.h>

typedef struct chainon {int val;
char nom[10];
struct chainon *suite;} *liste;

void aff(liste a)
{if(a) printf("%d est bien le a->val %s \n",a->val,a->nom), aff(a->suite);
else printf("\n");
}

void saisie(liste *p)
{int i; liste nouveau; *p=0;
for(i=0;i<6;i++)
{nouveau = (liste) malloc(sizeof(*nouveau));
scanf("%d",&nouveau->val);
gets (nouveau->nom);
nouveau->suite=*p;

  • p=nouveau;

}
}

int main()
{liste a;
a=malloc(sizeof(*a));
saisie(&a);
aff(a);
getchar();
getchar();
return 0;
}

:merci:

dnob700
dnob700
Niveau 10
18 février 2006 à 16:10:52

d´après moi ta fonction saisie est n´importe quoi. Mais tu as dit que tu faisait du C++, alors fais en. car entre :
nouveau = (liste) malloc(sizeof(*nouveau));
et
nouveau = new chainon;

il n´y a pas photo duquel est le plus lisible et moins source d´erreur.

ta fonction saisir ressoit un pointeur p initilisé. Puis tu fait *p=0. d´après moi tu ne devrais pas initialiser le pointeur a dans ton main.

Ensuite, tu utilise gets. Je ne vois pas trop ce que ça fait là et tu aurais interais à utiliser scanf comme pour val (ou alors cin puice que tu as dit que tu faisais du C++).

Une fois ceci corrigé (et en négligent le fait que tu ne nettoie pas ta mémoire après utilisation (il manque des free un peu partout)) ça devrait marcher je pense, car il n´y a pas d´erreur dans la logique.

Biskra_
Biskra_
Niveau 4
18 février 2006 à 19:11:32

Merci de ton aide.

Je crois en fait finalement ke c´est du C ke je fais, paske en cours j´ai jamais vu "new" comme mot clé à part en Java.

En fait, la fonction saisie je l´ai copié sur internet paske la mienne ne marchait pas du tout. Mais bon, faudrait ke j´la refasse à ma facon.

Pour le gets, t´as tt à fait raison, je vais utiliser le scanf.

J´ai un peu modifié la fonction saisie et j´ai pas initialisé a ds int main().

Finalement voila la fonction saisie (et elle marche enfin)

void saisie(liste *p)
{liste nouveau; *p=0;
do {nouveau=malloc(sizeof(*nouveau));
scanf("%d",&nouveau->val);
scanf("%9s",nouveau->nom);
nouveau->suite=*p;
*p=nouveau;
} while (nouveau->val!=0);
free(nouveau);
}

Maintenant je vais rajouter les autres fonctions au programme : supprimer les chainons dont le nom est "Dupont" et ceux dont la valeur est 0.

Ca s´annonce mal pour moi, vu ke j´maitrise pas du tout la fonction strcpy pr comparer les chaines de caractères.

En tout cas, merci bcp de ton aide :ok:
J´suis soulagé d´avoir avancé aujourd´hui.

dnob700
dnob700
Niveau 10
18 février 2006 à 20:13:10

à la fin de ta nouvelle fonction saisie, tu fait :
free(nouveau);
Je suppose que c´est parceque ce "nouveau" à une val==0 et donc tu ne veux pas le garder. Mais est ce qu´il ne faudrait pas faire avant :

  • p=nouveau->suite; //ou (*p)->suite

pour que p ne pointe plus sur l´élément que tu supprime ?

Biskra_
Biskra_
Niveau 4
18 février 2006 à 20:49:35

J´avoue ke j´sais pas du tout. J´suis vraiment perdu en pointeurs.

Mais si je fait pointer p sur nouveau->suite ca pointera aussi sur un élt ki n´existe plus ?

Je devrais p-e alors enlever le free(nouveau) ?

Biskra_
Biskra_
Niveau 4
20 février 2006 à 18:11:40

:up:

J´ai décidé d´enlever la fonction saisie et de mettre à la place une fonction nouv qui ajoute à la liste chainée un entier et un nom de type char nom[10].

liste nouv(int v, char n[10], liste p)
{liste a;
a=malloc(sizeof(*a));
a->val=v;
strcmp(p->nom,n);
a->suite=p;
return a;
}

Le compilateur ne m´indique pas d´erreur mais à l´éxecution, ca n´affiche pas le nom.

dnob700
dnob700
Niveau 10
20 février 2006 à 18:38:46

de tête je dirais que strcmp c´est pour comparer les chaine, mais que pour les copier il faut utiliser strcpy (peut-être pas de y). Vérifie ça déjà.

Oasis_its_good
Oasis_its_good
Niveau 7
20 février 2006 à 18:49:44

En effet, c´était bien strcpy.

Mais j´ai changé, et ca ne fonctionne tjrs pas. J´ai beau essayé ttes les combinaisons
strcpy(&a->nom,n)
strcpy(a->nom,&n), etc...

Et rien n´y fait, le prog ne marche tjrs pas. Alors ke au niveau de la syntaxe, pas d´erreur detectée par le compilateur.

dnob700
dnob700
Niveau 10
21 février 2006 à 00:14:04

faudrait que tu remette le code complet.
Par exemple là :
http://rafb.net/paste/

Sous forums
  • Aide à l'achat Mac
  • Internet
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment