Working C code dealing with lists: problem with memory leak
In your current code, I can't see the copying of lists repeatedly as you stated. You are using pointers here so you're not actually duplicating the list.

The freeList function should be called once you're done using your list (the one returned by holidayList()).

Side Note:
You can refactor the code by utilizing createNode function when creating nodes and adding it to the tail.