2016-02-11 2 views
2

Итак, я создаю связанный список в отдельной функции, и когда я распечатываю связанный список внутри функции, кажется, все в порядке. Однако; когда я иду на главную и пытаюсь получить доступ к связанному списку с 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); 
+2

'createLL (headOne, currOne, ch, number);' Это не может работать: он не может изменить «headOne», который будет навсегда NULL. –

+0

Расширение комментария Мартина, вам нужно будет передать указатель на указатели в createLL, чтобы вы могли изменять списки, объявленные в основном в рамках процедуры. То есть подпись createLL будет выглядеть примерно так: void createLL (struct node ** head, struct node ** curr, char ch, int number) – Harald

+0

Также обратите внимание, что около половины вопросов LL, размещенных на SO, имеют эту проблему , и есть ЛОТ. –

ответ

2

В функции 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); 
} 
+0

hrmm, теперь я набираю это error: запрос для данных участника 'в чем-то не структура или объединение – user3260745

+0

@ user3260745 вероятно опечатка , Опубликуйте код нарушения как обновление, но оставьте исходный код. – dbush

+0

Да, я пытался указать точку указателя на данные, не разрешая сначала. Я думаю, что это был порядок ошибки приоритета. – user3260745

Смежные вопросы