链表和双指针

时间:2014-07-01 07:59:04

标签: c linked-list

在下面的代码中,我试图在特定节点之后插入一个节点。在函数中,我将输入前一个节点的地址作为输入,之后我想插入新节点。问题出在函数insertAfter()的第10行 - 它表示我无法访问* prev_ref-> next。

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

 struct node
 {
  int data;
  struct node* next;
 };

 void push(struct node **head_ref, int data)
{

struct node* newNode = (struct node*)malloc(sizeof(struct node)) ;
newNode->next= *head_ref;
newNode->data= data;
*head_ref= newNode;

}


void insertAfter(struct node **prev_ref, int data)
{
if(*prev_ref==NULL)
{
    printf("prev ref cant be null");
    return;
}
struct node * newNode;
newNode = (struct node*)malloc(sizeof(struct node)) ;
newNode->next= *prev_ref->next;
newNode->data= data;
*prev_ref->next= newNode;

}


 void printList(struct node *node)
    {
     while (node != NULL)
      {
       printf(" %d ", node->data);
       node = node->next;
    }
   }

main()
{
struct node* head = NULL;
push(&head, 7);
push(&head, 1);
insertAfter(&head, 8);
printf("\n Created Linked list is: ");
printList(head);
 getchar();
 return 0;

 }

2 个答案:

答案 0 :(得分:1)

您知道(*p).s相当于p->s吗?我建议您尝试(*prev_ref)->next(**prev_ref).next

之类的内容

答案 1 :(得分:1)

您似乎取消引用prev_ref三级深度而不是两级。

pointer->field是指针的取消引用,相当于(*pointer).field

所以,**prev_ref->next;实际上是(***prev_ref).next;

删除一个星号或使用.代替->

编辑: 您似乎已跳过我们答案中包含的括号。

->的优先级高于*

效果是:

(*prev_ref)->next

  • 首先使用'*'并找到prev_ref指向的内存(让我们称之为内存位置A),
  • 然后使用' - &gt;'要查找A指向的内存,我们称之为B
  • 然后结构的next字段的位置,偏离B的设定距离,我们称之为C
  • 最后访问(读/写)存储在C的值。

现在为*prev_ref->next

  • 首先,使用->并找到prev_ref(A)指向的内存,只是一样
  • 然后结构的next字段的位置偏离A的设定距离,这恰好是内存中的一个完全随机的位置(因为A存储了指向结构的指针) ,而不是结构本身);让我们称之为位置D.
  • 然后它尝试在D指向的任何地方找到内存位置,这完全是随机的。

现在,系统不允许你这样做,因为它看到A不是结构所在的位置,而是指向结构的指针所在,因此错误消息

你问题的根本原因是你没有充分的理由使用指针指针。如果你总是使用普通指针,那么这一切都不会发生。 void push(struct node *head_ref, int data)void insertAfter(struct node *prev_ref, int data)prev_ref->next等。管理指针指针很棘手,容易出错(正如您所经历的那样),99%的情况完全没有必要。