2013-02-16 2 views
0

Juste pour expliquer ce qui se passe, j'entrer une liste liée triée dans une méthode. Dans cette liste liée sont des nœuds qui contiennent des chaînes. Les nœuds contiennent la chaîne, et 2 compteurs qui seront mentionnés plus tard. Ces chaînes sont alphanumériques et peuvent répéter. À la fin, je veux sortir une liste liée dans laquelle chaque noeud contient un mot unique (tout en minuscules), un compteur pour le nombre d'occurrences, et un compteur pour différentes variances du mot (les variances sont causées par différentes capitalisations de certains caractères). Je crois que cela fonctionne logiquement; Cependant, j'obtiens une erreur de segmentation.Segmentation Erreur 11 lors de la tentative de création d'une nouvelle liste chaînée à partir d'une liste triée

Merci d'avance!

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <ctype.h> 

typedef int bool; 
#define TRUE 1 
#define FALSE 0 


struct Node{ 
    char value[100]; 
    int numOccur; 
    int numVariance; 
    struct Node *next; 
}; 




struct Node * getFinalNodes(struct Node *head){ 
    struct Node * curr; 
    struct Node * finalNode; 
    struct Node * ptr; 
    struct Node * finalCurr; 
    struct Node * prev; 
    int m = 0; 
    int z = 0; 
    char lowercase1[100]; 
    char lowercase2[100]; 

    curr = head;          //curr = head of sorted node 
    finalNode = head; 
    ptr = finalNode; 
    finalCurr = finalNode; 

    for(m = 0; curr->value[m] != '\0'; m++){ 
     finalNode->value[m] = tolower(curr->value[m]);   //gets first word all lower-cased 
    } 

    ptr->numOccur=1;          //occurance is 1 
    ptr->numVariance=1;         //variance is 1 
    while(curr != NULL && curr->next != NULL){ 
     prev = curr; 
     curr = curr->next; 
     if((strcmp(prev->value, curr->value) != 0) && (strlen(prev->value) == strlen(curr->value))){   //example: Ab vs. AB 
      for(z=0; curr->value[z] != '\0'; z++){                //turn prev and curr into lowercase 
       lowercase1[z] = tolower(prev->value[z]);              //ex. Ab->ab and AB->ab 
       lowercase2[z] = tolower(curr->value[z]); 
      } 
      if(strcmp(lowercase1,lowercase2) == 0){                //if values are same, that means they are the same words, just different capitalizations 
       ptr->numOccur++; 
       ptr->numVariance++; 
      } 
      else{                        //if values are different, then they are completely different strings and put curr.value into a new finalNode 
       strcpy(finalNode->value,lowercase2); 
       ptr->next = finalNode; 
       ptr = ptr->next; 
       ptr->numOccur = 1; 
       ptr->numVariance =1; 
      } 
     } 
     else if((strcmp(prev->value, curr->value) != 0) && (strlen(curr->value) != strlen(prev->value))){                  //created arrays for prev and curr 
      for(z=0; curr->value[z] != '\0'; z++){                //turn prev and curr into lowercase              //ex. Ab->ab and AB->ab 
       lowercase2[z] = tolower(curr->value[z]); 
      } 
      strcpy(finalNode->value,lowercase2); 
      ptr->next = finalNode; 
      ptr = ptr->next; 
      ptr->numOccur = 1; 
      ptr->numVariance =1; 
     } 
     else if(strcmp(prev->value, curr->value) == 0){ 
      ptr->numOccur++; 
     } 
    } 
}; 
+1

Mettez le code dans un débogueur. Il vous dira sur quelle ligne le seg-fault est allumé. Utilisez le débogueur pour inspecter vos variables et vous apprendrez pourquoi. – abelenky

Répondre

0

Dans la boucle

while(curr != NULL){ 
    prev = curr; 
    curr = curr->next; 
    if((strcmp(prev->value, curr->value) != 0) && (strlen(prev->value) == strlen(curr->value))){ 

curr est NULL à la fin après curr = curr->next;. Puis strcmp(prev->value, curr->value) dereferences un null pointeur.

Vous pouvez changer la condition de boucle à

while(curr != NULL && curr->next != NULL) 
+0

J'ai changé cela et il s'est débarrassé de la faute de segmentation! Cependant, il semble que rien ne soit sorti de la méthode ... – user2074228

+0

Vous n'avez pas 'return' dans cette fonction, le compilateur ne s'est-il pas plaint? –

+0

@DanielFischer Le compilateur ne se plaint pas nécessairement d'une fonction non-nulle ne retournant pas dans tous les chemins de code. C'est probablement un comportement non défini, mais dans la pratique, ce qui peut arriver est qu'une valeur dans la pile est supposée être la valeur retournée par l'appelant. –

Questions connexes