在下面的代码中,我试图在特定节点之后插入一个节点。在函数中,我将给出前一个节点的地址作为输入,然后我想插入新节点。问题是在函数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%的情况下完全没有必要。