【问题标题】:Creating Linked List, not passing back to Main创建链接列表,而不是传回 Main
【发布时间】:2016-05-22 21:40:28
【问题描述】:

所以我在一个单独的函数中创建了一个链表,当我在函数中打印出链表时,似乎一切都很好。然而;当我转到 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);

【问题讨论】:

  • 'createLL(headOne,currOne, ch, number);'那是行不通的:它不可能改变'headOne',它将永远为NULL。
  • 扩展 Martin 注释,您需要将指针传递给 createLL 中的指针,以便您可以在例程中修改 main 中声明的列表。也就是说,createLL 的签名类似于: void createLL(struct node ** head, struct node** curr, char ch, int number)
  • 另外,请注意,在 SO 上发布的 LL 问题中约有一半存在这个问题,而且还有很多。
  • 双星的替代方案:返回头部; 'headOne=createLL(headOne,currOne, ch, number);'
  • 叹息! void 函数,但通过参数“返回”一个值... tssssss

标签: c pointers linked-list


【解决方案1】:

在 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 可能是一个错字。将违规代码作为更新发布,但保留原始代码。
  • 是的,我试图将 curr 的指针指向数据而没有先解决它。我认为这是优先顺序错误。
猜你喜欢
  • 2016-05-15
  • 1970-01-01
  • 2018-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多