2009-12-07 4 views
1

Ceci est mon code pour supprimer un noeud d'une liste chaînée.Suppression d'un noeud de la liste liée par index

vec_store détient seq et size. La variable seq contient les vecteurs et un pointeur.

Pour une raison quelconque, le else if(i<s->size-1) ne fonctionne pas, ce qui est la dernière condition.

Quelqu'un peut-il résoudre le problème? D'ailleurs c'est le code C.

void delete_vec(vec_store s, int i) 
{ 
    if (i<0 || s->size-1<i) 
    { 
     printf("Cannot delete vector because index %d is out of bounds\n",i); 
    } 
    else if (i==0) 
    { 
     node temp; 
     temp = s->seq; 
     s->seq = s->seq->next; 
     s->size--; 
     free(temp); 
    } 
    else if(i==s->size-1) 
    { 
     node temp1, temp2; 
     //temp1 = malloc(sizeof (node)); 
     temp2 = malloc(sizeof (node)); 
     temp1=s->seq; 
     if(temp1->next==NULL) 
     { 
      free(temp1); 
      s->seq=NULL; 
      s->size--; 
      printf("s->size-1\n"); 
     } 
     else 
     { 
      while (temp1->next!=NULL) 
      { 
       temp2 = temp1; 
       temp1 = temp1->next;  
      } 
      free(temp1); 
      temp2->next=NULL; 
      s->size--; 
      printf("s->size-1 2\n"); 
     } 
    } 
    else if(i<s->size-1) 
    { 
     node temp1,temp2; 
     int j; 
     temp1=s->seq; 
     temp2 = malloc(sizeof (struct node_record)); 

     for(j=0;j<=i-1;j++) 
     { 
      temp2=temp1; 
      temp1 = temp1->next; 
     } 

     free(temp1); 
     temp2->next=NULL; 
     s->size--; 
    } 
} 
+0

Indentation correcte s'il vous plaît. –

+4

Bonne nouvelle: Nous venons de recevoir un nouvel envoi de blancs, vous pouvez en utiliser autant que vous voulez! – caf

+0

Une indentation incorrecte devrait générer des erreurs de compilation, cela me brûle les yeux. – Dave

Répondre

0

Maintenant que votre indentation a été corrigée, je signalerai le problème. Lorsque vous supprimez un nœud dans la dernière condition, vous définissez le champ next pour le nœud précédent sur NULL, plutôt que sur le nœud suivant.

3

Ce code est injoignable:

if(temp1->next==NULL){ 
free(temp1); 
s->seq=NULL; 
s->size--; 
printf("s->size-1\n"); 
} 

... parce que temp1 est le premier élément dans la liste, et il serait donc seulement se produire si le premier élément a également été le dernier élément - ce qui implique s->size est 1 , donc cela aurait été attrapé par le cas précédent if (i==0).

Cette allocation à temp2 (qui se produit en deux endroits) est fausse - la valeur de temp2 est écrasé de toute façon, qui fuit la mémoire que vous avez alloué:

temp2 = malloc(sizeof (node)); 

Enfin, ce qui est probablement le problème que vous vous posez A propos se trouve ici (dans le cas if(i<s->size-1)):

free(temp1); 
temp2->next=NULL; 

Cette côtelettes toute la fin de la liste. Vous voulez garder la queue de la liste autour - comme ceci:

temp2->next = temp1->next; 
free(temp1); 

Par ailleurs, temp2 et temp1 sont des noms de variables assez sans intérêt - Qu'en est-il previous et current ou quelque chose? En outre, le cas spécial pour if(i==s->size-1) est complètement inutile - il devrait être géré très bien par le code que vous avez pour le cas if(i<s->size-1).

Questions connexes