Сортировка односвязного списка - C (СИ) (73918)

Формулировка задачи:

Добрый день. Проблема, не знаю, с чем связана, сортирует нормально, все работает, но иногда программа вылетает, а в других функциях постоянно вылетает.
void sortnumbermag()
/*Сортировка по номеру магазина*/
 
{
struct magazin *first;
struct magazin *last;
 
    char famzaved[20], adress[20];
    int nummag, numbermag;
 
  int i=0;
 
 while(1)
 {
   i=0;
   first=ptr;
   last=first->ptr_next;
   for(;last!=NULL;last=last->ptr_next, first=first->ptr_next){
    if(first->nummag > last->nummag) {
        strcpy(famzaved,first->famzaved);
        strcpy(first->famzaved,last->famzaved);
        strcpy(last->famzaved,famzaved);
 
        nummag = first->nummag;
        first->nummag=last->nummag;
        last->nummag=nummag;
 
        strcpy(adress,first->adress);
        strcpy(first->adress,last->adress);
        strcpy(last->adress,adress);
 
        numbermag = first->numbermag;
        first->numbermag=last->numbermag;
        last->numbermag=numbermag;
 
        i|=1;
        }
 
   }
if(! i)
    break;
 
};
}
Может в указателях дело? Но сортирует нормально. Критует на этой команде(в других функциях, которые ее (sortnumbermag) вызывает) Функция, в которой происходит крах и пух программы:
void newelementssort()
{
ptr = (struct magazin*) malloc(sizeof(struct magazin));
 
vvod();
 
printf("\n\n");
printf("\nВы ввели такие данные: \n");
printf("Фамилия: %s\n Номер магазина: %d\n Адрес магазина: %s\n Номер телефона: %d\n",ptr->famzaved,ptr->nummag,ptr->adress,ptr->numbermag);
ptr->ptr_next=NULL;
 
int answer;
    do
    {
        printf_white();
    puts("Куда хотите записать данные?(1-В Начало списка;2-В Конец списка)");
    printf_normal();
    scanf("%d",&answer);
    if (answer==1)
      {
addfirst();
showthelist();
sortnumbermag();
showthelist();
menu();
      }
    else if (answer==2)
    {
addlast();
showthelist();
sortnumbermag();
showthelist();
menu();
    }
    }while(answer!=0);
}
Функция addfirst:
ptr->ptr_next = head_ptr;
head_ptr = ptr;
Функция addlast:
struct magazin *p = head_ptr;
if (head_ptr == NULL)
 { // если список пуст,
 addfirst(); // вставляем первый элемент
 }
 else
 {
while (p->ptr_next) p = p->ptr_next; // ищем последний елемент
ptr->ptr_next = p->ptr_next; //(addafter)
p->ptr_next = ptr;

Код к задаче: «Сортировка односвязного списка - C (СИ) (73918)»

textual
last=first->ptr_next

9   голосов, оценка 3.889 из 5


СОХРАНИТЬ ССЫЛКУ