链表和双指针

  • 本文关键字:指针 链表 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;
 }

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

您似乎对prev_ref的解引用是三层而不是两层。

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

因此,**prev_ref->next;实际上是(***prev_ref).next;

去掉一个星号或者用.代替->

编辑:你似乎跳过了我们在回答中包含的括号。

->优先级高于*

效果是:

(*prev_ref)->next

  • 首先使用'*'并找到prev_ref所指向的内存(让我们称之为内存位置A),
  • 然后使用'->'查找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%的情况下完全没有必要。

相关内容

  • 没有找到相关文章

最新更新