Still celebrating National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
?
Solved

free nodes in a link list

Posted on 1998-08-14
5
Medium Priority
?
184 Views
Last Modified: 2010-04-15
I am writting an appan I have to read info from a database so I am going to the info in a link list and right now I am just building my link list functions...well I can add info to the link list...but when it comes to free all the nodes in the link list when ever I go to free the "main_tail" node my program crashes...anyone have clue as to why this is happening??  The code I am using is below

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>

struct file_collection
{
      char *filename;
      char *dir;
      struct file_collection *prev, *next;
};

void addrec(struct file_collection **, struct file_collection**, char *, char *);
void allocspace(struct file_collection **, struct file_collection **, struct file_collection **);
void freeallnodes(struct file_collection **, struct file_collection **);

void main(void)
{
      struct file_collection *main_top, *main_tail;

      main_top=main_tail=NULL;
      addrec(&main_top, &main_tail, "this is a test", "this is a dir test");
      addrec(&main_top, &main_tail, "this is a test2", "this is a dir test2");
      freeallnodes(&main_top, &main_tail);
}


void addrec(struct file_collection **main_top, struct file_collection **main_tail, char *temp_filename, char *temp_dir)
{
      struct file_collection *curr, *top, *tail;
                 
                 top = *main_top;
      tail = *main_tail;

      allocspace(&top, &curr, &tail);
                  curr->filename = temp_filename;
      curr->dir = temp_dir;

      *main_top = top;
      *main_tail = tail;
}

void allocspace(struct file_collection **top, struct file_collection **curr, struct file_collection **tail)
{
      *curr = (struct file_collection *)malloc(sizeof(struct file_collection));
      (*curr)->prev=(*curr)->next=NULL;
      if (*top == NULL)
      {
            *top = *curr;
            *tail = *curr;
      }
      else
      {
            (*curr)->prev = *tail;
            (*tail)->next = *curr;
            (*tail) = (*curr);
      }
}

void freeallnodes(struct file_collection **main_top, struct file_collection **main_tail)
{
      struct file_collection *p, *curr;

      for(p=(*main_top);p != NULL; p=p->next)
      {
            curr = p->next;
            if (curr != NULL)
                  free(curr);
      }

      if (*main_top != NULL)
            free(*main_top);
      if (*main_tail != NULL)
            free(*main_tail);
}
0
Comment
Question by:meetze
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
  • 2
5 Comments
 
LVL 4

Accepted Solution

by:
emmons earned 200 total points
ID: 1252117
FreeAllNodes is releasing a piece of memory, and then dereferencing it in the for loop. You need to grab the "next" pointer before you free up the "curr" pointer.
0
 
LVL 4

Expert Comment

by:emmons
ID: 1252118
Try something like:
for( p=(*main_top); p!= NULL; p=curr) {
      curr = p->next;
      if ( p != NULL)
            free( p);
}


0
 

Author Comment

by:meetze
ID: 1252119
I did it like this

void freeallnodes(struct file_collection **main_top, struct file_collection **main_tail)
{
      struct file_collection *p, *curr;
      
      for(p=(*main_top);p != NULL;)
      {
            curr = p;
            if (curr != NULL)
            {
                  p=p->next;
                  free(curr);
            }
            
      }

      if (*main_top != NULL)
            free(*main_top);
      if (*main_tail != NULL)
            free(*main_tail);
}

but now even though my main_top is freed and I am checking to see if it is NULL it still falls through the statement...any reason for this??
0
 

Author Comment

by:meetze
ID: 1252120
well i noticed that I do not need to free main_top or main_tail...thanks for the help..
0
 

Author Comment

by:meetze
ID: 1252121
well i noticed that I do not need to free main_top or main_tail...thanks for the help..
0

Featured Post

VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

An Outlet in Cocoa is a persistent reference to a GUI control; it connects a property (a variable) to a control.  For example, it is common to create an Outlet for the text field GUI control and change the text that appears in this field via that Ou…
Preface I don't like visual development tools that are supposed to write a program for me. Even if it is Xcode and I can use Interface Builder. Yes, it is a perfect tool and has helped me a lot, mainly, in the beginning, when my programs were small…
The goal of this video is to provide viewers with basic examples to understand and use structures in the C programming language.
The goal of this video is to provide viewers with basic examples to understand and use conditional statements in the C programming language.

715 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question