Ошибка сегментации в C при внедрении deque

Блокнот Jupyter

Предположим, что ваш список A

Затем вы можете запрограммировать следующее объявление, которое вы получите в виде файла csv (только для столбцов!)

R="\n".join(A)
f = open('Columns.csv','w')
f.write(R)
f.close()
-2
задан WedaPashi 13 July 2018 в 08:40
поделиться

2 ответа

В вашей программе есть 3 основные ошибки.

  1. В int *val = NULL; Здесь это должно быть int val не int *val.
  2. В функции remove_left(). Здесь вы должны отредактировать (*head) не (*tail). Также указатель (следующий, perv) управляется неправильно.
  3. То же самое в случае remove_right(). Ошибки в управляющих указателях.

Модифицированные функции: -

void remove_right(Node **head, Node **tail, int *val)   // modified This function.
{
    Node *temp = (*tail);
    if (temp == NULL)
    {
        printf("Cannot be removed doesn't point to anything\n");
        return;
    }

    else
    {
        *val = temp->data;
        temp->prev->next = NULL;
        (*tail) = temp->prev;
    }
    free(temp);
}

void remove_left(Node **head, Node **tail, int *val)   // modified This function.
{
    Node *temp = (*head);
    if (temp == NULL)
    {
        printf("Cannot be removed doesn't point to anything\n");
        return;
    }

    else
    {
        *val = temp->data;
        temp->next->prev = NULL;
        (*head) = temp->next;
    }
    free(temp);
}

Измененный main (): -

int main(int argc, char const *argv[])
{
    int val = -1;                         // Modified here
    Node *head = NULL;
    Node *tail = NULL;
    for (int i = 0; i < 10; ++i)
    {
        push_right(&head, &tail, i);
        push_left(&head, &tail, i);
    }
    remove_left(&head, &tail, &val);
    print_all(head);
    return 0;
}

Завершить код онлайн.

Выход: -

8
7
6
5
4
3
2
1
0
0
1
2
3
4
5
6
7
8
9
1
ответ дан anoopknr 17 August 2018 в 13:28
поделиться
  • 1
    Кроме того, предлагайте OP не бросать malloc в getnode(), +1 – WedaPashi 13 July 2018 в 10:19
  • 2
    Благодарю. Я внес изменения, и это сработало – Deepanshu Rautela 13 July 2018 в 10:31

Проблема здесь:

*val = temp -> data;

Val имеет значение NULL, поэтому попытка разыменования приведет к ошибке сегментации.

Если вы измените тип val на int вместо указатель на int. Затем вызовите remove_left следующим образом:

int main(int argc, char const *argv[])
{   int val = 0;
    Node *head = NULL;
    Node *tail = NULL;
    for (int i = 0; i < 10; ++i){
        push_right(&head, &tail,i);
        push_left(&head, &tail,i);
    }

    remove_left(&head, &tail, &val);
    print_all(head);
    return 0;
}

Это должно работать.

1
ответ дан Olivier Cazade 17 August 2018 в 13:28
поделиться
  • 1
    Даже после этого изменения программа по-прежнему разыменовывает висячий указатель в print_all: taas.trust-in-soft.com/tsnippet/t/6c9b0c3e – Pascal Cuoq 13 July 2018 в 08:30
  • 2
    вы не можете назначить NULL int, потому что вы получаете инициализацию предупреждения, делает целое число из указателя без литья – Nick S 13 July 2018 в 08:39
  • 3
    @NickS Вы правы, я пропустил какое-то изменение из-за необходимости при изменении типа Val. Я отредактирую его. – Olivier Cazade 13 July 2018 в 08:45
  • 4
    @PascalCuoq Действительно, у удаления функций есть некоторые недостатки. – Olivier Cazade 13 July 2018 в 08:48
Другие вопросы по тегам:

Похожие вопросы: