копирование структуры в связанный список

#c

#c

Вопрос:

Здесь я копирую структуру с одного узла на другой, но когда я сталкиваюсь с последним узлом, у меня будет ошибка сегментации, поскольку temp_clsf->next in memcpy будет указывать на недопустимое местоположение, как я могу это исправить? Я не могу освободить temp_clsf , поскольку это не динамическое распределение.

 while(temp_clsf!=NULL)
{
    memcpy(amp;temp_clsf, amp;temp_clsf->next, sizeof(struct classifier));
    if(temp_clsf->next ==NULL)
        return;
    else
        temp_clsf = temp_clsf->next;
}
  

Комментарии:

1. @cnicutar: я дал подробное объяснение здесь, и я застрял в этом, не в состоянии продолжить

2. Я вообще этого не понимаю. Кажется безумием копировать весь ваш список каждый раз, когда вы удаляете элемент. Я не понимаю, почему вы просто не указываете изменить начало вашей точки списка на следующий указатель текущего первого узла…

Ответ №1:

Внутри цикла сохраните указатель на предыдущий узел. Когда цикл завершится, обновите этот узел указателем на NULL

 /* pseudo-code */
while () {
    prev = curr;
    /* ... */
}
prev->next = NULL;
  

Ответ №2:

Просто переместите копию после if

  while(temp_clsf!=NULL)
    {
    if(temp_clsf->next ==NULL)
    return;
    //else
    memcpy(amp;temp_clsf, amp;temp_clsf->next, sizeof(struct classifier));
    temp_clsf = temp_clsf->next;
    }
  

Ответ №3:

используйте следующее условие в while.

 while(temp_clsf->next!=NULL)     
  

Комментарии:

1. если temp_clsf само по себе равно NULL, то при сравнении будет предпринята попытка разыменования нулевого указателя: лучший тест для обоих: while(temp_clsf!=NULL amp;amp; temp_clsf->next!=NULL)

Ответ №4:

Потенциально, temp_clsf->next может быть NULL , поэтому переместите NULL проверку перед memcpy

 while(temp_clsf != NULL)
{
    if(temp_clsf->next == NULL)
    {
        return;
    }

    memcpy(amp;temp_clsf, amp;temp_clsf->next, sizeof(struct classifier));

    temp_clsf = temp_clsf->next;
}
  

Обновление: temp_clsf и temp_clsf->next для меня выглядят как указатели. Итак, вы memcpy берете адреса указателей и перезаписываете то, что там есть. Это ваше намерение? Не уверен, что sizeof(struct classifier) такое, поскольку у нас нет типов структуры в вашем примере.

Комментарии:

1. если я сделаю это, последняя структура не будет скопирована, поскольку temp_clsf-> next будет указывать на null, но данные, которые у меня есть в этот момент temp_clsf, должны быть скопированы в предыдущую структуру

2. Итак, memcpy действительно должен копировать данные, а не указатели, верно? Какова структура типа для temp_clsf/classifier?

3. structure1-> structure2-> structure3-> structure4-> structure5 здесь я хочу выполнить memcpy, т.Е. если я удалю structure1, я хочу, чтобы результат был похож на structure1-> structure2-> structure3-> structure4-> structure5, но в моем коде я удалил structure1, я хочу, чтобы результирующая структура была такой structure2-> structure3-> structure4 -> structure5 но я для своего кода получаю o / p, подобный этому structure2-> structure3-> structure4-> structure4-> structure5 когда дело доходит до structure5 temp_clsf-> next будет равен NULL, и он выйдет из цикла.

Ответ №5:

Похоже, что вы выполняете сдвиг элементов, возможно, для удаления одного. Если бы это был упорядоченный массив, не было бы необходимости использовать next указатель. Я не уверен, какое другое статическое распределение вы используете, но вы можете просто сделать следующее, чтобы удалить отдельный элемент temp_clsf->next :

 temp_clsf->next=temp_clsf->next->next;