ajout d’un nouvel utilisateur à lister dans le programme c

J’essaie juste d’écrire une fonction simple pour append un ami à une liste de comptes d’utilisateurs. Toutes les informations sont fournies via le paramètre. Si l’utilisateur est déjà dans la liste, je n’ai pas besoin de l’append à nouveau, mais d’afficher des enregistrements indiquant qu’il est déjà dans la liste. J’ai écrit ce morceau de code. pas sûr si cela est correct, des suggestions pour améliorer le code? Est-ce que ça marche?

int add_friend(UserAccount* user, char Circle, UserAccount* friend) { struct UserAccountNode *p; p = (struct UserAccountNode *) malloc(sizeof(struct UserAccountNode)); while (p != NULL) if(ssortingcmp(user, p->friend) == 0){ p->next = head; // inserting at the beginning head = p; } else { printf("%d already exists", friend) }; } 

“pas sûr que ce soit correct” – fait-il ce que vous vouliez faire? si c’est le cas, cela pourrait être correct; si non. bien…

Et non, c’est loin d’être correct. la liste des choses qui ne vont pas en font un cas décent pour tout mettre au rebut. Ces choses incluent (sans s’y limiter):

  • Vous prétendez vouloir append un nouvel ami de manière conditionnelle, mais uniquement s’il ne figure pas déjà dans la liste. Pourtant, la première chose que vous faites est d’allouer de l’espace à quelque chose dont vous n’êtes même pas sûr d’avoir besoin.

  • Votre boucle n’a pas de condition de sortie qui puisse éventuellement être remplie (à moins que malloc() échoue réellement). À aucun moment p n’est le seul argument de condition de sortie, jamais atsortingbué à quoi que ce soit après la première ligne de la fonction, ce qui lui atsortingbue une allocation dynamic dont vous n’avez peut-être même pas besoin. Ie vous avez une boucle infinie.

  • Vous transmettez un compte d’ UserAccount* à ssortingcmp tant que premier paramètre, qui attend un caractère const char* .

  • Vous comparez p->friend avec user . Mais vous venez d’affecter les points p . Son membre friend est indéterminé, c’est-à-dire qu’il n’a pas de contenu défini. Pourtant, vous envoyez ce contenu indéfini à ssortingcmp() afin qu’il soit comparé au paramètre d’entrée user . Cela appelle un comportement indéfini .

  • La logique de comparaison est inversée. ssortingcmp() renvoie 0 si les chaînes ne sont pas sensibles à la casse; pas différent. Votre logique (même si vous n’invoquiez pas de comportement indéfini en raison de l’élément précédent mentionné ci-dessus) tente au moins d’append des éléments à la liste uniquement s’ils sont déjà présents.

  • Après deux itérations de la liste, si, par miracle, l’expression if est évaluée à deux fois comme vraie, vous avez créé un nœud circulaire à auto-référencement et orphelé toute la liste que vous aviez initialement dans l’abysse.

  • Vous envoyez à un friend , UserAccount* , à printf avec un spécificateur de format "%d" . Bien que cela ne plante probablement pas votre programme, il n’en rest pas moins un comportement indéfini. Si vous voulez imprimer une valeur de pointeur avec printf() utilisez "%p"

  • Les parameters de fonction inutilisés sont honnêtement le moindre de vos soucis. Ils n’ont peut-être pas été utilisés, mais du côté positif, ils n’ont pas non plus été utilisés de manière incorrecte ; quelque chose qui ne peut pas être dit pour l’ user et friend .

Je ne vais pas vous parler de “bon effort” ou de “bon essai”. Il n’y a aucune chance que ce code soit même compilé et absolument aucune chance qu’il puisse fonctionner correctement. Vous devez passer en revue l’algorithme que vous essayez d’implémenter, ainsi que l’utilisation des pointeurs et de la mémoire dynamic en C.

Votre code a au moins deux problèmes:

  1. while (p != NULL)

    Si p n’est pas NULL , ce sera une boucle infinie, car vous ne changez pas p dans le corps de la boucle, ni utilisez d’instructions telles que break pour en sortir.

  2. ssortingcmp(user, p->friend)

    Vous utilisez une variable non initialisée, cette

     p = (struct UserAccountNode *) malloc(sizeof(struct UserAccountNode)); 

    seulement alloué une structure, mais vous ne l’initialisez jamais avant de l’utiliser dans la boucle while.

D’autres erreurs sont possibles, telles que vous n’utilisez jamais l’argument friend , les parameters de ssortingcmp() peuvent être incorrects, etc.