2010-12-09 4 views
2

Bonne journée!Liste liée - Erreur

Notre professeur nous a demandé de créer une liste d'étudiants en utilisant une liste chaînée. Sa condition est d'ajouter de nouvelles informations sur les élèves dans une liste de manière à ce qu'elles soient triées en fonction des notes de l'élève par ordre décroissant. Une erreur se produit chaque fois que j'exécute le programme. Mon code est le suivant. Suis-je sur le bon chemin ou est-ce que je manque quelque chose d'important? Quelles sont les causes de l'erreur? Votre réponse serait très appréciée. Merci d'avance.

typedef struct student{ 
     char name[11]; 
     unsigned int grade; 
     struct student* next;  
    }NODE; 

int main (void){ 
    NODE *head, *std; 
    std = new_student(); 
} 
+0

Quelle erreur obtenez-vous? – yurib

+1

... et votre boucle while dans add_student renvoie une valeur dans la toute première itération – yurib

+0

"Il ferme le programme sans aucun message d'erreur" - si votre programme fonctionne, il lira l'entrée puis quittera sans aucun message. –

Répondre

3

Je pense que le bug est probablement que vous n'initialisez pas head à NULL dans main avant de le transmettre à add_student, mais il y a d'autres questions:

  • obtient peut dépasser le tampon si vous entrez trop de caractères d'entrée pour le nom.
  • comme yurib dit, la boucle add_student revient toujours à la première tentative
  • vous ne cochez pas le retour de malloc, mais c'est pas va être le problème.
  • vous n'avez pas déclaré les fonctions que vous appelez.
  • vous n'avez pas inclus <stdlib.h> (pour malloc) ou <stdio.h> (pour printf).
+0

@Steve Jessop quels sont les autres problèmes? – newbie

+0

@newbie: désolé, je ne faisais que les ajouter. –

+0

@Steve Jessop ok merci. Je n'ai pas inclus tous mes codes. J'ai déjà supprimé le retour dans ma boucle while .. qu'est-ce que tu veux dire que je n'ai pas vérifié le retour de malloc? Merci encore. – newbie

3
NODE *head, *std; 
head = null; 
std = null  
std = new_student(); 
head = add_student(head, std); 

essayer. Vous n'initialisez pas la tête, et quand

if (head == NULL) return to_add; 

sur add_student, la tête contient la valeur de garbage.

Edit1: Gardez à l'esprit

NODE *curr_std, *prev_std = NULL; 

ne correspond pas à

NODE * curr_std = NULL; 
NODE * prev_std = NULL: 

si c'est ce que vous vouliez écrire alors vous devriez:

NODE *curr_std = NULL, *prev_std = NULL; 

mais le comme vous l'avez fait n'affecte pas votre programme.

Edit2:

while (curr_std != NULL && to_add->grade < curr_std->grade){ 
    prev_std = curr_std; 
    curr_std = curr_std->next; 
} 
prev_std->next = to_add; 
to_add->next = curr_std; 
return head; 

est un peu bizarre. Cette tête de retour; ne devrait pas vraiment être là. Vous ne "rafraîchissez" pas votre LL de cette façon.

2

tout le monde d'abord fait d'erreur, oublièrent à init vars:

NODE *head=NULL, *std=NULL; 
3

Le return dans la boucle while semble très suspecte, car cela signifie que le code après la boucle ne peut jamais être atteint.

Également dangereux d'utiliser gets() dans un réseau de 11 caractères; très facile d'obtenir un débordement. Utilisez fgets().

2

Le compilateur devrait vous parler de certaines erreurs avant de le faire. Ceci est l'important avertissement gcc m'a donné:

1209.c:18:10: warning: 'head' is used uninitialized in this function 
+0

Assurez-vous d'activer vos avertissements («-W -Wall» sur la ligne de commande si vous êtes sur GCC). – Kos

+0

il n'y a pas d'avertissement dans mon complier .. – newbie