doubly linked list with double pointer problems
Im trying to come up with a doubly linked list for a mini job system.
Right now, I cant seem to remove any nodes and my final empty call gives me a double free error during runtime. Im guessing its in the double pointer magic now but Im pretty confused.
Anyone mind taking a look?
Thanks
Code:
void init_job_node(struct job_node *job) {
/* Data */
job->childPid = 0;
job->status = 0;
job->cmd = NULL;
/* Locations */
job->next = NULL;
job->prev = NULL;
}
int create_job_node(struct job_node **job) {
/* Create */
*job = (struct job_node *)malloc(sizeof(struct job_node));
if(!*job)
return 1;
/* Setup */
init_job_node(*job);
return 0;
}
void free_job_node(struct job_node **job) {
/* Data */
free((*job)->cmd);
/* Locations */
free(*job);
*job = NULL;
}
void empty_job_nodes(struct job_node **job_list) {
/* Base/Error Cases */
if(*job_list == NULL)
return;
/* Recurse! */
empty_job_nodes(&(*job_list)->next);
/* Step */
free_job_node(&(*job_list));
}
void print_job_nodes(struct job_node *job_list) {
/* Base/error cases */
if(job_list == NULL)
return;
/* Step */
printf("%i\t%s\n", job_list->childPid, job_list->cmd);
/* Recurse */
print_job_nodes(job_list->next);
}
void append_node(struct job_node **job_list, struct job_node *job) {
/* Base cases */
if(*job_list == NULL) {
*job_list = job;
return;
}
if((*job_list)->next == NULL) {
(*job_list)->next = job;
job->next = NULL;
job->prev = (*job_list)->prev;
return;
}
/* Recurse */
append_node(&((*job_list)->next), job);
}
void remove_node(struct job_node **job) {
if(*job == NULL)
return;
if((*job)->prev != NULL)
(*job)->prev->next = (*job)->next;
if((*job)->next != NULL)
(*job)->next->prev = (*job)->prev;
free_job_node(job);
*job = NULL;
}
int main() {
int i;
struct job_node *head;
struct job_node *tmp;
create_job_node(&head);
for(i = 1; i < 10; ++i) {
create_job_node(&tmp);
tmp->childPid = i;
append_node(&head, tmp);
}
printf("first:\n");
print_job_nodes(head);
printf("\n");
remove_node(&tmp);
printf("after:\n");
print_job_nodes(head);
printf("\n");
empty_job_nodes(&head);
printf("empty:\n");
print_job_nodes(head);
return 0;
}