Il y a un bug majeur dans votre allocation de mémoire. stackp
est un tableau automatique (pile), ce qui signifie que sa durée de vie prend fin dès le retour de l'insertion. Vous devez utiliser une autre méthode d'allocation. Vous pouvez demander à l'appelant d'allouer un nouveau tableau et de passer les deux pointeurs, ou vous pouvez le faire vous-même avec malloc
(n'oubliez pas de libérer).
Cependant, le reste semble correct. C'est à peu près le seul algorithme pour un insert non sur place. Vous pouvez être en mesure de le faire un peu plus rapidement avec des astuces spéciales (par exemple copier deux ints à la fois). memmove
et memcopy
peuvent utiliser de telles optimisations sur certaines architectures.
De plus, de nombreux algorithmes écriraient stackp[index]
lorsque la position est trouvée, plutôt qu'à la fin. Mais l'algorithme de base est fondamentalement le même.
Une alternative serait de faire l'insertion sur place (en déplaçant uniquement les éléments après la position d'insertion), plutôt que d'utiliser une nouvelle matrice. Vous développez souvent avec realloc
. Cela est préférable dans de nombreuses situations, car il permet d'économiser du temps de copie et d'éviter un nouvel emplacement de mémoire (ce qui peut également fragmenter le tas). Enfin, une autre structure de données est entièrement une liste chaînée. Cela élimine totalement le besoin de copier des éléments, mais utilise plus de mémoire et empêche l'accès aléatoire.
Je ne suggère de retourner la mémoire allouée (comme les réponses ci-dessous ont suggéré), car il est un moyen facile de fuir Mémoire. –
@Alex, je l'ai suggéré comme une possibilité, avec laisser l'appelant allouer. Je pense que les deux sont bien aussi longtemps que la documentation de la fonction le spécifie clairement. –
vrai, mais il semble que toutes les fonctions standard, et les fonctions winAPI, préfèrent ce dernier. –