2

この質問はすでにフォーラムに投稿されていることは知っていますが、解決しようとした小さな問題があり、成功しませんでした

このコードを試したり、他のスレッドにスタックオーバーフローを投稿したりすると、常に違反アクセスエラーが発生します。このコードを試しました

void reverse(node **headRef)
{
    node *current = *headRef, *next,*result=NULL;
    while(current)
    {
      next = current->next;
      current->next = result;
      result =current;
      current = next;
    }
    *headRef = result;
}

Eclipse CPP、Visual Studio、およびコードボックでは、常に違反アクセスが発生します。スタッフを段階的にデバッグしようとすると、現在がNULLであっても、カーソルがwhileループに入ると思います。 current-> nextをcurrent->nextに置き換えると、current-> nextがすでにNULLであるにもかかわらず、カーソルはループに入ります。

while(current->next)
    {
      next = current->next;
      current->next = result;
      result =current;
      current = next;
    }

ループを回避するために同じスタッフをしつこくやろうとしましたが、問題は解決しません

 void recursiveReverse(node **headRef) {
   node *first = *headRef;
   node *rest = first->next;
   if(rest ==NULL) return;
   recursiveReverse(&rest);
   first->next->next = first;
   first->next = NULL;
   *headRef = rest;
}

VisualStudioからのエラーは次のとおりです。

VisualStudioの実行のスクリーンショット

4

1 に答える 1

1

エラーを解決するためにコードを少し変更し、ノードも送り返しました。これが役立つことを願っています。GCC コンパイラはアクセス違反を示しませんでした。

#include <stdio.h>

typedef struct Node {
  char data;
  struct Node* next;
} Node;

void print_list(Node* root) {
  while (root) {
    printf("%c ", root->data);
    root = root->next;
  }
  printf("\n");
}

Node* reverse(Node **root) {
  Node *current = *root, *next,*result=NULL;
  while(current){
    next = current->next;
    current->next = result;
    result =current;
    current = next;
  }
  return result;
}

int main() {
  Node d = { 'd', 0 };
  Node c = { 'c', &d };
  Node b = { 'b', &c };
  Node a = { 'a', &b };

  Node* root = &a;
  print_list(root);
  root = reverse(&root);
  print_list(root);

  return 0;
}

出力:

a b c d

d c b a
于 2013-03-11T06:33:32.807 に答える