У вас проблема с индексом.
Очевидно, вы хотите, чтобы первый индекс был равен 1 - хорошо.
Давайте назовем функцию с индексом, равным 2.
Таким образом, вы окажетесь здесь:
else{
for(i=0; i<index-1; i++)
p=p->next;
x=p->data;
p->prev->next=p->next;
if(p->next)
p->next->prev=p->prev;
free(p);
}
, что опять-таки:
else{
for(i=0; i<2-1; i++) // notice
p=p->next;
x=p->data;
p->prev->next=p->next;
if(p->next)
p->next->prev=p->prev;
free(p);
}
или
else{
for(i=0; i<1; i++) // notice
p=p->next;
x=p->data;
p->prev->next=p->next; // arghh... seg fault
if(p->next)
p->next->prev=p->prev;
free(p);
}
Так что это перекрывает элемент головки и вызывает ошибку сегмента, потому что головка не имеет элемента prev.
Совет: используйте индексирование нуля
Кстати: никогда не делайте
for(i=0; i<index-1; i++)
p=p->next;
Либо измените его на
for(i=0; i<index-1; i++) p=p->next;
или лучше
for(i=0; i<index-1; i++)
{
p=p->next;
}