Сохранение динамической структуры в файле

Решение задач на языке программирования C

Пользователь вводит адреса сайтов и их ТИЦ. Данные о каждом сайте сохраняются в элементе динамической структуры. По команде пользователя данные записываются в файл, при этом память, выделенная под динамическую структуру, высвобождается. Далее пользователь может снова начать вводить информацию о сайтах, либо завершить выполнение программы.

#include <stdio.h>
#include <malloc.h>
#include <string.h>
 
struct site {
       char address[25];
       unsigned index;
       struct site *next;
};
 
struct site *add_site(struct site *, char *adds, int tic); // присоединение элемента к голове, возврат адреса головы
void save(struct site *); // сохранение стека
 
main() {
	char adds[25];
	unsigned tic;
	struct site *head; // адрес, указывающий на голову стека
 
	while (1) {
		head = NULL;
		while (1) {
		   printf("Адрес сайта (s - stop): ");
		   scanf("%s", adds);
		   if (strcmp(adds,"s") == 0) break;
		   printf("Тиц %s: ", adds);
		   scanf("%u", &tic);
		   head = add_site(head,adds,tic);
		}
		printf("\n");
		save(head);
		free(head);
		printf("Продолжить? (y - yes): ");
		scanf("%s",adds);
		if (strcmp(adds,"y") != 0) break;
	}
}
 
struct site *add_site(struct site *head, char *ch, int tic) {
	struct site *element; // указатель на новую структуру		
	element = (struct site *)malloc(sizeof(struct site)); // выделяем память
	element->next = head;
	strcpy(element->address, ch);
	element->index = tic;
	return element;
}
 
void save(struct site *p){
	FILE *f;
	f = fopen("sites.txt","a");
	while (p != NULL) { // пока не конец стека    
	   fprintf(f,"%s - %u\n", p->address, p->index);
	   p = p->next; // продвижение по списку
	}
	fclose(f);
}