Этот код недоступен:
if(temp1->next==NULL){
free(temp1);
s->seq=NULL;
s->size--;
printf("s->size-1\n");
}
... потому что temp1
является первым элементом в списке, и поэтому это произойдет только в том случае, если первый элемент будет также последним элементом - что означает, что s->size
равно 1, так что это было бы обнаружено ранее if (i==0)
дело.
Это выделение для temp2
(которое происходит в двух местах) является поддельным - значение temp2
в любом случае перезаписывается, что приводит к утечке памяти, выделенной вами:
temp2 = malloc(sizeof (node));
Наконец, в чем проблема, о которой вы спрашиваете, лежит здесь (в случае if(i<s->size-1)
):
free(temp1);
temp2->next=NULL;
Это удаляет весь конец списка. Вы хотите держать хвост списка вокруг - как это:
temp2->next = temp1->next;
free(temp1);
Кстати, temp2
и temp1
- довольно скучные имена переменных - как насчет previous
и current
или что-то еще? Кроме того, особый случай для if(i==s->size-1)
является полностью ненужным - он должен прекрасно обрабатываться кодом, который вы используете для случая if(i<s->size-1)
.