В вашей функции addcard ();Вы проверяете, имеет ли p значение NULL:
else if (p == NULL) {
temp->previous = p;
temp->next = NULL;
p->next = temp;
*hr = temp;
Затем вы пытаетесь получить доступ к NULL p в строке:
p->next = temp;
Как получить доступ к тому, что не существует!Вот откуда исходит ошибка исключения нулевого указателя.
Может быть, вы хотите инициализировать p как новую структуру card_s, как вы это сделали с temp.Использование calloc инициализирует как следующий, так и предыдущий указатели в NULL.
p = calloc(1, sizeof(card));
После этого вы застряли в бесконечном цикле, особенно в вашей функции createdeck.Причина в том, что вы никогда не увеличиваете или не уменьшаете ни j, ни i, поэтому цикл никогда не прерывается.
while (i <= 13) {
j = 1;
while (j <= 4) {
if (j == 1)
addcard(p, hl, hr, i, 'S');
if (j == 2)
addcard(p, hl, hr, i, 'H');
if (j == 3)
addcard(p, hl, hr, i, 'D');
if (j == 4)
addcard(p, hl, hr, i, 'C');
}
}