IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

souci liste chainee


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 31
    Points : 39
    Points
    39
    Par défaut souci liste chainee
    Bonsoir tout le monde.

    voilà j'ai un souci avec ma liste chainée;

    ma structure se présente comme suite:
    typedef struct Noeud{
    int x;
    int y;

    struct Noeud *voisin;
    struct Noeud *suivant;
    }noeud;
    je voudrais creer une liste chainée ordonnée en fonction des x, puis lorsque les x sont égaux il fait le tri en fonction des y. Les elements de la liste sont initialisées au clavier.

    je pense que c'est la fonction void inserer qui pose le probleme, lorsque j'entre des x et y inférieurs à celle du premier de la liste; alors là tous les voisin->x et voisin->y sauf le dernier, copient celle du nouvelle element.

    voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    #include<stdio.h>
    #include<stdlib.h>
     
    typedef struct Noeud{
    			int x;
    			int y;
     
    			struct Noeud *voisin;
    			struct Noeud *suivant;
    			}noeud;
     
    noeud *premier, *dernier;
     
    //sert à la creation d'un nouveau neoud.
    noeud *creernoeud(void)
    {
    	noeud *p;
    	p = (noeud*)malloc(sizeof(noeud));
    	p->voisin = (noeud*)malloc(sizeof(noeud));
    	if(p==NULL) puts("Memoire insufisante"), exit(1);
     
    	return p;
    }
     
    //sert à initialiser la liste
    void initlist(void)
    {
    	premier = dernier = creernoeud();
    }
     
    //permet l'insertion d'un nouvelle element
    void inserer( int x, int y, int vx, int vy)
    {
    	noeud *p = premier;//element qui sert de parcours à la liste.
     
    	//initialisation de dernier qui sert de sentinelle lors de parcours.
    	dernier->x = x;
    	dernier->y = y;
    	dernier->voisin->x = vx;
    	dernier->voisin->y = vy;
     
    	while((p->x < x) || ((p->x == x) && (p->y < y)))//cherche le bon emplacement pour le nouvelle element.
    	{
    		p = p->suivant;
    	}
     
    	noeud *q = creernoeud();//On crée une structure pour copie l'element que l'on veut deplacer pour inserer le nouveau.
     
    	if(p == dernier)
    	{
    		dernier = q;
    		dernier->voisin = q->voisin;
    	}
    	else
    	{
    		*q = *p;
    	}
    	//initialisation du nouvelle element
    	p->x = x;
    	p->y = y;
    	p->voisin->x = vx;
    	p->voisin->y = vy;
     
    	//p->suivant est l'element deplacer pour inserer le nouvelle element.
    	p->suivant = q;
    }
     
    //On affiche la liste.
    void afficher_liste(void)
    {
    	noeud *p;
    	for(p = premier; p!=dernier; p = p->suivant)
    	{
    		printf("p->x:%3d p->y:%3d p->voisin->x:%3d p->voisin->y:%3d\n", p->x, p->y, p->voisin->x, p->voisin->y);
    	}
    }
     
    main()
    {
    	int x, y;
    	int vx, vy; 
    	noeud *p = creernoeud();
    	initlist();
    	puts("Saisir une serie d'entier suivant suivant d'un caractère non numérique: ");
    	while(1)
    	{
    		//Saisie pour initialisation des champs pour le nouvel element à initialiser.
    		puts("Saisir les coordonnee du pivot: ");
    		scanf("%d", &x);
    		scanf("%d", &y);
     
    		puts("Saisir les coordonnee du voisin: ");
    		scanf("%d", &vx);
    		scanf("%d", &vy);
     
    		//appel fonction pour l'insertion d'un nouvelle element.
    		inserer(x, y, vx, vy);
     
    		puts("liste par ordre croissant des entiers saisis:\n");
    		afficher_liste();
    	}
     
    	return 0;
    }
    je sais que c'est long, je met tout parce que je sais pas d'ou vient l'erreur.

    GRAND MERCI POUR L'AIDE.

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Une petite remarque :
    Ta fonction creernoeud() n'initialise pas les membres de la structure, tu risques (non, tu vas) de te retrouver avec des valeurs aléatoires dedans et des pointeurs pointant sur n'importe quoi.

    D'autre part, lorsque tu créee un noeud, tu alloues aussi un voisin. Pourquoi ne pas laisser ce pointeur à NULL tant qu'il n'a pas de voisins.

    Je n'ai pas compris l'usage du champs "voisin". Tu as 2 relations d'ordre dans ta liste. Une liée à la liste qui utilise le champs "suivant" et une plus applicative qui utilise le champs "voisin" ?

Discussions similaires

  1. [LG]probleme d'ajout dans une liste chainée...
    Par misteryann dans le forum Langage
    Réponses: 5
    Dernier message: 08/03/2004, 20h28
  2. [LG]Listes chainées avec pointeur
    Par PaowZ dans le forum Langage
    Réponses: 2
    Dernier message: 17/02/2004, 19h49
  3. [LG]liste chainee + pointeur + affichage
    Par k_ro dans le forum Langage
    Réponses: 6
    Dernier message: 17/01/2004, 13h58
  4. [LG]Tri par insertion dans une liste chainée
    Par mister_dsg dans le forum Langage
    Réponses: 4
    Dernier message: 18/12/2003, 22h34
  5. [LG]suppression dans une liste chainée
    Par mister_dsg dans le forum Langage
    Réponses: 9
    Dernier message: 16/12/2003, 21h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo