begin process at 2012 02 11 20:42:29
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Algorithme

 > 

Maths

 > 

Tri par insertion sur liste simplement chainée


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Tri par insertion sur liste simplement chainée

jeudi 3 janvier 2008 à 17:00:46 | Tri par insertion sur liste simplement chainée

Jordy89

Bonjour,

Dans le cadre de la manipulation d'une liste chaînée, je suis amené à effectuer un tri; Je me suis renseigné à gauche et à droite, et il apparait que le tri par insertion serait particulièrement bien adapté.

Cependant, je n'arrive pas à mettre au point l'algorithme réalisant ce tri !
J'ai déjà effectué des tris par insertion sur des vecteurs, et ça ne pose aucun problème.

Quelqu'un pourrait-il m'aider ?

Merci
jeudi 3 janvier 2008 à 22:06:51 | Re : Tri par insertion sur liste simplement chainée

vecchio56

Administrateur CodeS-SourceS
e étant l'élément à insérer au bon endroit dans ta liste.
Tu cherches e1 et e2 tels que e1 <= e et e <= e2 (comme tu le fais avec des vecteurs).
La seule chose qui change est la déplacement de l'élément. Si je n'oublies rien, ca doit donner ca:

e.précédent.suivant = e.suivant
e.suivant.precedent = e.precedent
e1.suivant = e
e2.precedent = e
e.precedent =e1
e.suivant = e2

Ceci est pour une liste chainée dans les deux sens


_____________________________________
Un éditeur de ressources gratuit pour Windows

vendredi 4 janvier 2008 à 08:53:58 | Re : Tri par insertion sur liste simplement chainée

acx01b

salut

typedef struct element {
  struct element *suivant;
   ...
} element, *liste;

en général le prototype de la fonction inserer_element

ça sera

void inserer_element(liste *l, element e);

ou bien

liste inserer_element(liste l, element e);

en effet l'élément peu être rajouté au début de la liste et dans ce cas la liste change d'adresse, il faut donc que inserer_element puisse modifier l'adresse de la liste


vendredi 4 janvier 2008 à 09:53:22 | Re : Tri par insertion sur liste simplement chainée

Jordy89

Dans mon cas, tous les éléments sont déjà présents dans la liste. Il ne s'agit pas d'effectuer une insertion dans une liste triée, mais de trier une liste chainée d'élément.
Ca revient au même ?
On considère chaque élément et on modifie son pointeur afin de réordonner la totalité de la liste ?
vendredi 4 janvier 2008 à 09:57:06 | Re : Tri par insertion sur liste simplement chainée

Jordy89

Ou alors on considère chaque élément, on recherche sa place définitive dans la liste, on le supprime de son ancienne place et on insère un nouvel élément à la bonne place avec l'information de celui qu'on a supprimé ?
vendredi 4 janvier 2008 à 10:42:17 | Re : Tri par insertion sur liste simplement chainée

acx01b

Réponse acceptée !
salut

créer une liste chainée se fait en 2 temps (enfin tu peux faire les 2 en même temps aussi)

allouer de la mémoire ou simplement créer les noeuds, puis les connecter ensembles

dans ton cas tu as les noeuds qui sont déja créés suffit de les connecter ensemble

liste trier_liste(liste l) {
  liste liste_tree = NULL;
  while(l) {
    element *e = l;
    l = l->suivant;
    liste_triee = inserer_element(liste_triee, e);
  }
  return liste_triee;
}

tu considères simplement ta liste non triée comme une liste d'éléments à insérer successivement au bon endroit dans la liste vide

c'est pour ça que la fonction trier_liste se résume en fait à inserer_element (le reste est trivial)
si tu comprends pas dis moi
vendredi 4 janvier 2008 à 13:40:33 | Re : Tri par insertion sur liste simplement chainée

Jordy89

Nickel, ça marche ! Merci beaucoup !
jeudi 20 novembre 2008 à 01:59:48 | Re : Tri par insertion sur liste simplement chainée

mohboa

j'ai l'algo de trie par insertion vous pouvez convertir en c ou c++  c'est facile
voila mon programe :

procedure triInsertion( t: tab en entrée sortie )

Algorithme

debut

variable  

i, j, mem: entier
pour de1 j N-1 faire /* sélection de l'élément à insérer*/

                mem <- t[ i ]

                j <- i

tant que  

j>0   et  t[j-1]>mem    repeter /* décalage des éléments plus grands */

         t[ j ] <- t[ j-1 ]

          j <- j - 1

fin tant que

        t[ j ] <- mem /* insertion */

fin pour;

fin ;






       merci

lundi 27 avril 2009 à 19:08:01 | Re : Tri par insertion sur liste simplement chainée

amar901130

Bonjour,
voici une réponse détallée sur le Tri par insertion sur liste simplement chainée

#include<iostream>
using namespace std;

struct boite{
    char val;
    boite* lien;};
typedef boite* liste;
/*************************************/
void creliste(liste &l){
    l=0;
}
/********************************************/
bool appartient(liste l,char x){
    if(!l) return false;
    else
        if(l->val==x) return true;
        else
            if(l->val>x) return false;
            else return appartient(l->lien,x);
}
/****************************************/
void ajouter_trier(liste &l, char x){
    if(!appartient(l,x)){
        liste aux=new boite;
        aux->val=x;
        if(l==0) { l=aux; aux->lien=0; }
        else
        if(l->val>x) { aux->lien=l; l=aux; }
        else {
            liste prec=l;
            bool fini=false;
            while(!fini){
                if(prec->lien==0) fini=true;
                else
                if(prec->lien->val>x) fini=true;
                else prec=prec->lien;
            }
            //inserer aux aprés prec
            aux->lien=prec->lien;
            prec->lien=aux;
        }
    }
}
/*********************************/
void detruire(liste &l){
    while(l){
    liste aux=l;
    aux = l;
    l= l->lien;
    delete aux;
    }
}
/**********************************/
void trie(liste &l){
liste liste_vide_a_remplir=0; // on cree notre liste vide a remplir
    liste aux=l;             // aux est le pointeur qui va parcourir la liste non triee
    while(aux!=0){
        ajouter_trier(liste_vide_a_remplir,aux->val);// on ajoute en ordre dans liste_vide_a_remplir
        aux=aux->lien;
    }
    liste ptr=l;
    l=liste_vide_a_remplir;
    detruire(ptr); // on detruit ptr pour effacer la liste non triee
}
/************************************/
void affiche(liste l){
    while(l){
        cout<<l->val<<" ";
        l=l->lien;
        }
        cout<<endl;
        }
/*********************************/
void ajouter_debut(liste &l, char x){
    liste aux=new boite;
    aux->val=x;
    aux->lien=l;
    l=aux;
}
/********************************/
int main(){
liste maliste;
creliste(maliste);
ajouter_debut(maliste,'C');
ajouter_debut(maliste,'B');
ajouter_debut(maliste,'A');
ajouter_debut(maliste,'E');
affiche(maliste);
trie(maliste);
affiche(maliste);
return 0;
}
test OK!







Cette discussion est classée dans : liste, tri, insertion, simplement, chainée


Répondre à ce message

Sujets en rapport avec ce message

Tri par insertion sur listes simplement chainées [ par ichigoZ710 ] Bonjour, voilà, je vous explique rapidement mon problème, je dois élaborer une procédure de tri par insertion sur une liste qui vient en paramètre de tri par insertion dans une liste chaînée [ par titi4659 ] Bonjour,j'ai un problème avec une liste chaînée.j'ai une liste d'element que j'arrive a récupéré mais je souhaiterai que lorsque je récupère un elemen Trier une liste simplement chainée [ par MasterShadows ] Bonjour à tous,Dans un TP de C que je dois, il y'a une question qui me perturbe :Nous devions créer une structure LIST qui est simplement chainée, qui [LangageC]Tri d'une liste chainée d'entiers. [ par sleyze ] Bonsoir, quelqu'un pourrait il me donner une fonction permettant de trier une liste chainée L dans l'ordre croissant en utilisant un tri autre que le [Urgent] Fonction à liste chainée [ par zalpa ] Bon voila, je suis un etudiant en 1ere année Informatique appliqu&#233 Structures nommées incompréhensible ... à l'aide [ par otterc8 ] Bonjour, voila j'ai ce bout de code que je ne comprends pas top, malgré des recherches sur les structures, il y a des choses que je ne comprends pas! dessiner un graph a partir d'une liste chainée [ par MrMed ] Bonjour a tous, J'ai devellopé un programme qui analyse les données d'un spectrometres et qui me sort l'intensités d'une longueur d'ondes precises pou Suppression cellule d'une liste doublement chainée [ par donlefou ] Quelqu'un pourrait m'écrire le code pour supprimer une cellule à une position dans une liste.J'ai un fichier C_Cellule.hpp / C_Cellule.cpp de cette st Liste, tri sur date (et non texte de la date) [ par themaste ] Bonjour à tous!Voila, mon problème est que j'ai une liste d'éléments, dont une colonne est remplie par une date.Mon souci, c'est que lorsque je clique Du remord pour vector [ par guifr ] Bonjour à tous, Dans une application je dois utiliser des tableaux dynamiques. Ma première idée était de créer des listes chainées, mais j'hésite à i


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 8,112 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales