2017-09-09 2 views
0
typedef struct node{ 
int data; 
struct node *link; 
}nd; 

nd *head=NULL , *ahead=NULL; 

void create_node(int item) { 
    nd *new, *temp; 
    new = (nd*)malloc(sizeof(nd)); 
    new->data=item; 
    new->link=NULL; 
    if(head==NULL) { 
     head=new; 
    } 
    else { 
     temp=head; 
     while(temp->link!=NULL) { 
      temp=temp->link; 
     } 
     temp->link=new; 
    } 

} 

void alpha_check(int size) { 
    int i,j,num; 
    nd *ti , *tj; 
    ti=tj=head; 
    for(i=1 ; i<=size ; i++) { 
     for(j=1 ; j<=size ; j++) { 
      num = ((ti->data)*10)+(tj->data); 
      tj=tj->link; 

      /*if(num>=65 && num<=90) { 
        printf("\n->%d",num); 
       }*/ 
     } 
    //ti=ti->link; 
    } 
} 

void traverse(nd *thead) { 
    while(thead->link!=NULL) { 
     printf("%d ",thead->data); 
     thead=thead->link; 
    } 
    printf("%d ",thead->data); 
} 

Ainsi, le seul problème dans le code ci-dessus réside dans la fonction alpha_check() où je veux la variable point de tj au noeud suivant. Au lieu de pointer sur le nœud suivant, il me donne Erreur de segmentation (core dumped). s'il vous plaît expliquer pourquoi je ne peux pas faire tj point au prochain nœud.lien de défaut de segmentation de la liste

+0

for (i = 1; i <= taille; i ++) { for (j = 1; j <= taille; j ++) { . est un problème .. vous devez ajouter un drapeau à traverser jusqu'à thread-> link! = NULL –

+0

Nous ne voyons pas comment la liste est créée, ni comment 'alpha_check' est appelé. Il semble que cette «taille» est erronée. Il est également étrange de parcourir une liste en utilisant une taille et non une boucle while jusqu'à la fin de la liste. Utilisez un débogueur. Il vous dira ce qui ne va pas et où cela arrive. –

+0

Quelle est la taille que vous passez à la fonction alpha_check? – Ganeshdip

Répondre

1

La faute de segmentation est un signal au noyau que votre programme accède à la mémoire qu'il n'a pas l'autorisation d'amener le noyau à terminer votre programme. Cela signifie généralement que vous dépassez les limites d'un tableau ou dans votre cas vous déréférencer un pointeur qui pointe vers quelque chose qu'il ne devrait pas être. Comme les autres allusions dans leurs commentaires, vous devez avoir un type de contrainte différent lors de la traversée d'une liste chaînée que lorsque vous traversez un tableau. Vous devez traverser tout en vérifiant que le pointeur de noeud n'est pas NULL plutôt que de faire une certaine taille fixe dans une boucle for.

J'ai modifié ma procédure alpha_check et ajouté une fonction principale pour la tester. Cela fonctionne comme prévu.

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

typedef struct node { 
    int data; 
    struct node* link; 
} nd; 

nd *head=NULL , *ahead=NULL; 

void create_node(int item) { 
    nd* new,* temp; 
    new = (nd*)malloc(sizeof(nd)); 
    new->data = item; 
    new->link = NULL; 

    printf("%d %p\n", new->data, new); 

    if(head == NULL) { 
     head = new; 
    } 
    else { 
     temp = head; 
     while(temp->link) 
      temp = temp->link; 
     temp->link = new; 

    } 
} 

void alpha_check(int size) { 
    int i,j,num; 
    nd* ti ,* tj; 
    ti = tj = head; 

    for(i = 1 ; i <= size ; i++) { 
     while(tj) { 
      num = ti->data * 10 + tj->data; 
      tj = tj->link; 

     //if(num>=65 && num<=90) 
     //{ 
      printf("\n->%d",num); 
      printf(" %p\n", tj); 
     //} 
    } 
    //ti=ti->link; 
    } 
} 

void traverse(nd* thead) { 
    while(thead->link) { 
     printf("%d ", thead->data); 
     thead = thead->link; 
    } 
    printf("%d ", thead->data); 
} 

int main(void) { 
    create_node(10); 
    create_node(1); 
    create_node(5); 

    alpha_check(2); 
    return 0; 
} 
+0

Vous pouvez utiliser une boucle for avec une taille si vous créez une structure qui contient le pointeur de tête et une variable qui suit la taille de la liste. 'struct List { size_t taille; nd * tête; } ' Vous pouvez également utiliser une boucle for au lieu d'une boucle while pour vérifier que le pointeur n'est pas nul' for (tj = head; tj; tj = tj-> link) ' –

+0

Merci de m'avoir aidé. Ça marche. –