2

我知道这个问题已经在论坛上发布了,但是我有一个小问题我试图解决但我没有成功

当我尝试此代码甚至代码将其发布到stackoverflow其他线程时,我总是会遇到违规访问错误我尝试了此代码

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 和代码块中,它总是以违规访问而告终,当我尝试逐步调试员工时,我发现我奇怪地认为光标进入了 while 循环,即使当前为 NULL,甚至当我尝试用 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;
}

这是视觉工作室的错误:

Visual Studio 执行截图

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 回答