#include <stdio.h>
#include <stdlib.h>
typedef struct data {
int a, b;
} Data ;
struct node {
Data info;
int priority;
struct node *link;
};
typedef struct node* Node;
void insert(Node header, int pr, Data el) {
Node cur = header;
Node tmp = malloc(sizeof(struct node));
tmp->info = el;
tmp->priority = pr;
//descending <=
while (cur->link != NULL && pr >= cur->link->priority)
cur = cur->link;
tmp->link = cur->link;
cur->link = tmp;
}
Node delete(Node header) {
Node tmp;
if (header->link == NULL)
printf("Empty priority queue");
else {
tmp = header->link;
header->link = tmp->link;
free(tmp);
return tmp;
}
}
void display(Node head) {
Node cur = head->link;
while (cur != NULL) {
printf("%d ", cur->priority);
cur = cur->link;
}
}
int main(int argc, const char *argv[])
{
Data d;
Node tmp;
Node head = malloc(sizeof(struct node));
head->link = NULL;
insert(head, 3, d);
insert(head, 2, d);
insert(head, 1, d);
while (head->link != NULL) {
tmp = delete(head);
printf("%d ", tmp->priority);
}
return 0;
}
La sortie de ceci est 1 2 3. mais en supprimant j'ai libéré la mémoire (libre (tmp)), puis renvoyé tmp. pourquoi est tmp encore l'impression dans la fonction principale. l'utilisation du compilateur gccne peut pas supprimer un emplacement de mémoire
Pourquoi votre code accède-t-il à de la mémoire qui a déjà été 'libre()' 'éditée? Pourquoi la fonction 'delete()' renvoie-t-elle un pointeur vers la mémoire 'free()' 'ed en premier lieu? –
En note, je ne suis pas sûr que j'aime particulièrement le typedef Node. Si quelqu'un ne regarde que votre définition de fonction, en un coup d'œil il semble que vous passez par valeur plutôt que par référence. Votre utilisation de typedef ici diminue la lisibilité. Juste mon avis si :) –
@Demian: Je suis d'accord, mais mon prof à l'université utilisé pour faire la même chose. Je l'ai détesté, mais certaines personnes semblent aimer cacher des pointeurs dans typedefs. – Lucas