创建链接列表,不传回主
因此,我在一个单独的函数中创建链接列表,并且当我打印出函数中的链接列表时,似乎一切正常。然而;当我转到main并尝试使用printf访问链接列表时,我得到了一个分段错误,我很困惑,为什么。创建链接列表,不传回主
void createLL(struct node* head, struct node* curr, char ch, int number){
//lowest digit is the head
while (((scanf(" %c",&ch)) >= 0)){
curr = (struct node*)malloc(sizeof(struct node*)); //allocate space
number = ch - '0' ; //convert char to number
curr->data = number;
curr->next = head;
head = curr;
}
curr = head;
//troubleshoot
while(curr){
printf("%d\n",curr->data);
curr = curr->next;
}
curr = head;
printf("%d\n",curr->data);
}
int main(){
//initials
int i, number;
char ch;
//node pointers
struct node* headOne = NULL;
struct node* currOne = NULL;
struct node* headTwo = NULL;
struct node* currTwo = NULL;
//create linked list
createLL(headOne,currOne, ch, number);
printf("%d\n",currOne->data);
createLL(headTwo,currTwo, ch, number);
printf("%d\n",currTwo->data);
在C函数中按值传递所有参数。所以如果你想在函数中改变一个变量,你需要传递该变量的地址并在函数中解引用参数。
另外,您没有为节点分配适量的空间。你想sizeof(struct node)
,而不是sizeof(struct node *)
。
void createLL(struct node **head, struct node **curr, char ch, int number){
//lowest digit is the head
while (((scanf(" %c",&ch)) >= 0)){
// don't cast the return value of malloc
*curr = malloc(sizeof(struct node)); //allocate space
number = ch - '0' ; //convert char to number
(*curr)->data = number;
(*curr)->next = *head;
*head = *curr;
}
*curr = *head;
//troubleshoot
while(*curr){
printf("%d\n",(*curr)->data);
*curr = (*curr)->next;
}
*curr = *head;
printf("%d\n",(*curr)->data);
}
int main(){
//initials
int i, number;
char ch;
//node pointers
struct node* headOne = NULL;
struct node* currOne = NULL;
struct node* headTwo = NULL;
struct node* currTwo = NULL;
//create linked list
createLL(&headOne,&currOne, ch, number);
printf("%d\n",currOne->data);
createLL(&headTwo,&currTwo, ch, number);
printf("%d\n",currTwo->data);
}
hrmm,现在我正在采集这个 错误:请求成员'数据'的东西不是结构或工会 – user3260745
@ user3260745可能是一个错字。将有问题的代码发布为更新,但保留原始代码。 – dbush
是啊,我正在尝试将curr的指针指向数据而不先解析它。我认为这是一个优先顺序错误。 – user3260745
'createLL(headOne,currOne,ch,number);'这是行不通的:它不可能改变'headOne',它将永远是NULL。 –
扩展Martin评论,您需要将指针传递给createLL中的指针,以便您可以修改例程中在main中声明的列表。也就是说,createLL的签名应该是这样的:void createLL(struct node ** head,struct node ** curr,char ch,int number) – Harald
另外请注意,在SO上发布的大约一半的LL问题有这个问题,并且有很多。 –