Сторнирование связанного списка с помощью двойного указателя - PullRequest
0 голосов
/ 22 сентября 2018

Я пытаюсь перевернуть ссылку с помощью двойного указателя, и gcc продолжает давать мне статус выхода -1:

#include <stdio.h>
#include <stdlib.h>

typedef struct Node
{
  struct Node * link;
} Node;

Node ** reverse(Node ** rootp)
{
  if ( ( rootp == NULL )|| ( (*rootp) == NULL) || (((*rootp)->link) == NULL) )
  {
    return rootp;
  }

  Node ** old_previous = (Node **)malloc(sizeof(Node));

  Node ** previous = (Node **)malloc(sizeof(Node));

  previous = rootp;

  Node ** current = (Node **)malloc(sizeof(Node));

  current = &((*rootp)->link);

  ((*previous)->link) = NULL;


  while ( ((*current)->link) != NULL )
  {
    old_previous = previous;

    previous = current;

    current = &((*current)->link);

    ((*previous)->link) = (*old_previous);

  }

  ((*current)->link) = (*previous);

  free(old_previous);

  free(previous);

  free(current);

  return current;
}

void print_list(Node * root)
{
  if ( root == NULL )
  { return; }

  if (root->link == NULL)
  { printf("%p\n\n",root); return; }

  printf("%p ",root);

  print_list(root->link);
}

int main(void) 
{
  Node * first = (Node *)malloc(sizeof(Node));

  Node * second = (Node *)malloc(sizeof(Node));

  Node * third = (Node *)malloc(sizeof(Node));

  first->link = second;

  second->link = NULL;

  third->link = NULL;

  print_list(first);

  Node ** rev = reverse(&first);

  print_list(*rev);

  free(first);

  free(second);

  free(third);

  return 0;
}

Поскольку gcc просто сообщает о состоянии выхода -1, я полагаю, что я должен разыменовать NULLузел где-то в обратной функции.Когда мой друг перевел идею обратной функции в программу на Python, она работала просто отлично.Где-то в функции реверса должна быть проблема с указателем.У кого-нибудь из вас есть идеи о том, что я делаю неправильно?

Спасибо всем за внимание.

...