在下面的代码中,我试图在特定节点之后插入一个节点。在函数中,我将输入前一个节点的地址作为输入,之后我想插入新节点。问题出在函数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;
}
答案 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
),A
指向的内存,我们称之为B
,next
字段的位置,偏离B
的设定距离,我们称之为C
现在为*prev_ref->next
->
并找到prev_ref
(A)指向的内存,只是一样next
字段的位置偏离A
的设定距离,这恰好是内存中的一个完全随机的位置(因为A存储了指向结构的指针) ,而不是结构本身);让我们称之为位置D. 现在,系统不允许你这样做,因为它看到A不是结构所在的位置,而是指向结构的指针所在,因此错误消息
你问题的根本原因是你没有充分的理由使用指针指针。如果你总是使用普通指针,那么这一切都不会发生。 void push(struct node *head_ref, int data)
,void insertAfter(struct node *prev_ref, int data)
,prev_ref->next
等。管理指针指针很棘手,容易出错(正如您所经历的那样),99%的情况完全没有必要。