thanx k-ballo,你解决了我的prevoius问题,但后来我降落到另一个!
我创建了节点,然后尝试显示它们,但每次我调用append_node()
时,双指针**head_ptr
(用于保存第一个指针*head
的地址,而后者,保存链表的第一个节点的地址),保持NULL值,好像之前对append_node(&head, value)
的调用没有向*head
添加任何节点。
所以每当我显示列表时,它都是空的!! :
#include <stdio.h>
struct __node
{ int data;
struct __node *next;
};
typedef struct __node node;
int append_node(node **head_ptr, int value) //double pointer head_ptr to simulate call-by-reference
{ node *temp, *q;
temp = (node *) malloc(sizeof(node));
if(!temp)
{ printf("\ninsufficient memory!!");
return -1;
}
q = *head_ptr; //as *head_ptr is address of a pointer (which is *head), so any changes made after this line in q should also be reflected in main().. (i guess so!)
temp->data = value;
temp->next = NULL;
if(q == NULL)
{ q = temp;
printf("\nq is empty");
return 0;
}
while( q->next != NULL)
{ q = q->next;
}
printf("\nq is not empty");
q->next = temp;
return 0;
}
int disp_list(node **head_ptr)
{ node *q;
int i=1;
q = *head_ptr;
if(q != NULL)
{ while( q != NULL )
{ printf("|%d-%d|--->", i++, q->data);
q = q->next;
}
}
else
{ printf("\nlist is empty!!");
}
return 0;
}
int main()
{ node *head=NULL;
int value, res, i=0;
while(i<3)
{ printf("\nenter the data to be inserted into the node: ");
scanf("%d", &value);
res = append_node( &head, value);
i++;
}
printf("\nprinting all the nodes...\n") ;
res = disp_list(&head);
printf("\n---------------\nexiting...\n\n\n");
return 0;
}
我知道我可以从append_node()返回* q并将其重新分配给* head或声明* head为全局..但我想*头部被所谓的pass-by-reference方法操纵。 (实际上在c中没有传递引用!)我的编译器是:gcc版本4.5.2(Ubuntu / Linaro 4.5.2-8ubuntu4)
PLZ help..i我不是专家所以请使用更简单的术语!! :P
答案 0 :(得分:2)
你对append_node
的初始调用是传递一个指针指向未初始化的节点的指针(让我们按下它的null,尽管它可能只是垃圾)。然后你做
q = *head_ptr;
//above statement causes a segment fault error..
// that statement should be fine, we will get the value of main's head, which we pressume to be null
// now we will try to dereference null by accesing its next element
while( q->next != NULL)
{ q = q->next;
}
答案 1 :(得分:0)
此计划存在两个主要问题:
head
未初始化且包含垃圾。append_node()
中的空列表。这两个问题都会导致分段错误。