### Erasing a Linked List

Erasing a linked list involves traversing the list starting from the first node, freeing the storage allocated to the nodes, and then setting the pointer to the list to NULL. If p is a pointer to the start of the list, the actions specified through the following code will erase the list:

```while(p != NULL)
{
temp = p;
p = p->link;
free(t);
}
```

But a better strategy of erasing a list is to mark all the nodes of the list to be erased as free nodes without actually freeing the storage of these nodes. That means to maintain this list, a list of free nodes, so that if a new node is required it can be obtained from this list of free nodes.

```# include <stdio.h>
# include <stdlib.h>
struct node
{
int data;
struct node *link;
};
struct node *insert(struct node *, int);
void erase(struct node **, struct node **);
void printlist(struct node *);

void erase(struct node **p, struct node **free)
{
struct node *temp;
temp = *p;
while (temp->link != NULL)
temp = temp->link;
temp->link = (*free);
*free = *p;
*p = NULL;
}

struct node *insert(struct node *p, int n)
{
struct node *temp;
if (p == NULL)
{
p = (struct node *) malloc(sizeof(struct node));
if (p == NULL)
{
printf("Error\n");
exit(0);
}
p->data = n;
p->link = NULL;
} else
{
temp = p;
while (temp->link != NULL)
temp = temp->link;
temp->link = (struct node *) malloc(sizeof(struct node));
if (temp->link == NULL)
{
printf("Error\n");
exit(0);
}
temp = temp->link;
temp->data = n;
temp->link = NULL;
}
return (p);
}

void printlist(struct node *p)
{
printf("The data values in the list are\n");
while (p != NULL)
{
printf("%d\t", p->data);
p = p->link;
}
}

int main()
{
int n;
int x;
struct node *start = NULL;
struct node *free = NULL;

/* this code will create a free list for the test purpose*/
printf("Enter the number of nodes in the initial free list \n");
scanf("%d", &n);
while (n-- > 0)
{
printf("Enter the data values to be placed in a node\n");
scanf("%d", &x);
free = insert(free, x);
}

/* this code will create a list to be erased*/
printf("Enter the number of nodes in the list to be created for
erasing \n");
scanf("%d",&n);
while (n-- > 0)
{
printf("Enter the data values to be placed in a node\n");
scanf("%d", &x);
start = insert(start, x);
}
printf("The free list islist is:\n");
printlist(free);
printf("The list to be erased is:\n");
printlist(start);
erase(&start, &free);
printf("The free list after adding all the nodes from
the list to be erased is:\n");
printlist ( free );
getchar();
return 0;
}
```

#### Explanation

The method of erasing a list requires adding all the nodes of the list to be erased to the list of free nodes, as shown here. 