Ajout au millieu d'une liste chaînée en c

Fermé
inspiron90 - 30 déc. 2009 à 14:11
 inspiron90 - 31 déc. 2009 à 07:58
Bonjour,
voila je suis en train de créer un programme sur les listes chaînées en langage c , et après l'ajout au début et à la fin de de la liste que j'ai déjà fait , alors ce que je vous demande c'est de m'aider a écrire une fonction qui permet d'ajouter un élément dans une position donner dans la liste ,voila la structure que j'utilise :


typedef struct element element;
struct element
{
int val;
struct element *nxt;
};


merci ..............
A voir également:

4 réponses

Salut,

Ca pourra t'aider Insertion ailleurs dans la liste
0
merci , pour ton lien mais il est un peut compliqué si vous avez un autre lien ou une autre méthode laisser la et je vais voir .........merci pour votre aide
0
rimounatn Messages postés 93 Date d'inscription jeudi 24 décembre 2009 Statut Membre Dernière intervention 7 septembre 2010 15
30 déc. 2009 à 20:59
bonjour, j'espere que je vais t'aidé voici des fonctions sur les listes chainée (simple):
#include<stdio.h>
#include<stdlib.h>

struct element{
int valeur;
struct element * suivant;
};

typedef struct element element;
typedef element* liste;

liste ajouterEnTete(liste L, int v){
liste temp = NULL;
temp = (liste)malloc(sizeof(element));
temp->valeur = v;
if(L==NULL){
//Liste Vide
temp->suivant = NULL;
}else{
temp->suivant=L;
}
return temp;
}

liste ajouterEnFinIterative(liste L, int v){
element * temp = NULL;
temp = (liste)malloc(sizeof(element));
temp->valeur = v;
temp->suivant = NULL;
//parcourir iterativement jusK la fin
element * aux = L;
while(aux->suivant != NULL) {
aux=aux->suivant;
}
aux->suivant = temp;
return L;
}

//ici c'est une procedure donc on passe l'adresse de la liste et non pas la liste elle même (passage par adresse)
void ajouterEnFinRecursive(liste* L, int v){
if(*L == NULL){
element * temp = NULL;
temp = (liste)malloc(sizeof(element));
temp->valeur = v;
temp->suivant = NULL;
*L=temp;
//printf("cas L null element valeur %i ajouté\n",v);
}else if((*L)->suivant == NULL){
element * temp = NULL;
temp = (liste)malloc(sizeof(element));
temp->valeur = v;
temp->suivant = NULL;
(*L)->suivant = temp;
//printf("cas L->suivant null element valeur %i ajouté\n",v);
}else{
liste ptr = (*L)->suivant;
ajouterEnFinRecursive(&ptr,v);
}
}

liste SupprimerElementEnTete(liste L){
if(L==NULL){
return NULL;
}else{
liste tmp;
tmp = L->suivant;
free(L);
return tmp;
}
}

liste SupprimerElementEnFin(liste L){
if(L==NULL){//liste vide
return NULL;
}else if(L->suivant == NULL){//liste à 1 element
free(L);
return NULL;
}else{
liste ptrDernierElem = L;
liste ptrAvantDernierElem;
while(ptrDernierElem->suivant != NULL) {
ptrAvantDernierElem = ptrDernierElem;
ptrDernierElem = ptrDernierElem->suivant;
}
ptrAvantDernierElem->suivant=NULL;
free(ptrDernierElem);
return L;
}
}

liste SupprimerElement_i(liste L,int index){
if(index==0){//premier elem
return SupprimerElementEnTete(L);
}else{
liste ptrSurElem = L;
liste ptrAvantElem;
int i=0;
while(ptrSurElem->suivant != NULL && i!=index) {
ptrAvantElem = ptrSurElem;
ptrSurElem = ptrSurElem->suivant;
i++;
}
if(i==index){//l'element i existe
ptrAvantElem->suivant=ptrSurElem->suivant;
free(ptrSurElem);
return L;
}else{//index superieur à la taille de la liste
return L;// pas de changement
}
}
}

int nbOccurences_val(liste L, int val){
liste ptr = L;
int nbOcc_val = 0;
while(ptr != NULL){
if(ptr->valeur == val){
nbOcc_val++;
}
ptr = ptr->suivant;
}
return nbOcc_val;
}

int tailleListeIterative(liste L){
element* ptr;
int taille=0;
ptr = L;
while(ptr != NULL){
ptr = ptr->suivant;
taille++;
}
return taille;
}

int tailleListeRecursive(liste L){
if(L == NULL){
return 0;
}else{
return 1+tailleListeRecursive(L->suivant);
}
}


int estVide(liste L){
//classique
//return (L == NULL);
return (L==NULL)? 1 : 0;
}
void afficherListe(liste L){
element* ptr;
int i=0;
ptr = L;
while(ptr != NULL){
printf("element num %i = %i\n",i,ptr->valeur);
i++;
ptr = ptr->suivant;
}
}

element* Element_i(liste L, int index){
element* ptrSurElem = L;
int i=0;
while(ptrSurElem->suivant != NULL && i!=index) {
ptrSurElem = ptrSurElem->suivant;
i++;
}
if(i==index){//l'element i existe
return ptrSurElem;
}else{//index superieur à la taille de la liste
return NULL;// pas de changement
}
}

int main(){

liste maListe = NULL;
int i=0;
for(i=0;i<10;i++){
ajouterEnFinRecursive(&maListe,i);
}
printf("Liste au debut:\n");
afficherListe(maListe);
printf("la taille par recursivité est %i\n",tailleListeRecursive(maListe));
printf("la taille par maniere iterative est %i\n",tailleListeIterative(maListe));

return 0;
}
bon courage
0
merci beaucoup rimounatn pour ton aide , ce matin je vais utiliser ton code pour résoudre mon problème ......@+
0