Удаление двух элементов из двусвязного списка segfault - PullRequest
0 голосов
/ 15 октября 2018

У меня есть программа, использующая двусвязный список, и упрощает их.

NULL <-> [HEADPTR] <-> [VALUEA, 1] <-> [ValueB, 2] <-> [ADD, VALUEA, VALUEB] <-> ... Остальная часть списка

NULL <-> [VALUEC, 3] <-> ... Остальная часть списка.

Я просто запуталась вкак я удаляю VALUEA и B. Я могу успешно удалить одно из значений, но когда я пытаюсь удалить оба из них, я получаю ошибку сегментации.Я знаю, что моя логика удаления второго узла неверна.Я использую систему трех указателей, чтобы найти и упростить значения.

while(rightP->next != NULL){
            if(rightP->critical == 'Y'){
                //printf("Found a critial\n");
                //Critical helps me find what I need to merge
                        rightP->field2 = leftP->field2 + middleP->field2;
                        //printf("MERGING ADD %d\n", rightP->field2);
                        temp1 = leftP;
                        if(leftP->prev != NULL)
                            leftP = leftP->prev;
                        else
                            leftP->prev = NULL;
                        leftP->next = temp1->next;
                        leftP->next->prev = leftP;
                        free(temp1);
                        //bad segment
                        //Yields Seg fault
                        temp2 = middleP;
                        middleP->prev = leftP;
                        middleP->next = temp2->next;
                        middleP->next->prev = middleP;
                        middleP = rightP;
                        rightP = rightP->next;
                        free(temp2);
          }
          leftP = leftP->next;
          middleP = middleP->next;
          rightP = rightP->next;
          else{
                leftP = leftP->next;
                middleP = middleP->next;
                rightP = rightP->next;
          }
}

1 Ответ

0 голосов
/ 15 октября 2018

лет назад я записал заметку в моей книге по K & R.это был , вы не можете сделать это относительно использования free(temp1);

вы не опубликовали полный код, но вы используете temp1 = leftP, а затем free(temp1) - почти то же, что яЗаписано несколько лет назад, говоря, что не может этого сделать.

Никогда не понимал причину этого, оно основывалось на использовании malloc() или calloc(), а затем при использовании free() аргумент free()должен быть указатель, используемый в операторе malloc или calloc.

предлагает вам повторно использовать временный указатель другим способом;затем любое имя указателя при условии, что вы использовали malloc, затем используйте этот указатель и установите его в качестве узла, который вы хотите освободить ... после настройки значений ->next и ->previous, чтобы сохранить список в целости.

нашел его:

стр. 252, K & R Язык программирования C, 2-е издание

void free ( void *p )

free освобождает пространство, на которое указывает p;это ничего не делает, если р равно нулю. p должен быть указателем на пространство, ранее выделенное calloc, malloc или realloc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...