Ajout au millieu d'une liste chaînée en c
inspiron90
-
inspiron90 -
inspiron90 -
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 ..............
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:
- Ajouter un element au debut d'une liste chainée en c
- Liste déroulante excel - Guide
- Liste déroulante en cascade - Guide
- Ajouter une application au démarrage - Guide
- Liste code ascii - Guide
- Ajouter une signature sur word - Guide
4 réponses
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
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
#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