C中的反向链表

时间:2013-03-09 11:15:05

标签: c

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

当我尝试这段代码甚至代码贴出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->替换当前的电流,然后光标仍然进入循环调度,即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的错误:

screnshot of visual studio execution

1 个答案:

答案 0 :(得分: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