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.