Объявление главы / первого узла в связанном списке - PullRequest
1 голос
/ 12 октября 2019

Привет всем У меня проблемы в связанном списке. Учитывая два куска кода, я должен выяснить, почему один из них не работает

Код 1 -

struct node {
    int data;
    struct node *link;
};

void insert(struct node *head) {
    struct node *last, *temp;
    head = (struct node *)malloc(sizeof(struct node));
    printf("Input an integer: ");
    scanf("%d", &head->data);
    head->link = NULL;
    last = head;
    {
        int n = 3;
        while(n>0){
            temp = (struct node *)malloc(sizeof(struct node));
            printf("Input an integer: ");
            scanf("%d", &temp->data);
            temp->link = NULL;
            last->link = temp;
            last = temp;
            n--;
        }
    }
     return;
}

void display(struct node *p) {
    while(p) {
        printf("%d  ",p->data);
        p = p->link;
    }
    return;
}

int main() {
    struct node *head;
    insert(head);
    display(head);
    return 0;
}

, а второй код -

struct node {
    int data;
    struct node *link;
}*head;

void insert() {
    struct node *last, *temp;
    head = (struct node *)malloc(sizeof(struct node));
    printf("Input an integer: ");
    scanf("%d", &head->data);
    head->link = NULL;
    last = head;
    {
        int n = 3;
        while(n>0){
            temp = (struct node *)malloc(sizeof(struct node));
            printf("Input an integer: ");
            scanf("%d", &temp->data);
            temp->link = NULL;
            last->link = temp;
            last = temp;
            n--;
        }
    }
     return;
}

void display(struct node *p) {
    while(p) {
        printf("%d  ",p->data);
        p = p->link;
    }
    return;
}

int main() {
    insert();
    display(head);
    return 0;
}

Теперь мойвопрос в том, почему объявление head в main в первом не дает o / p для функции отображения, где объявление глобально во втором коде работает? Отвечая на этот вопрос, мне интересно, что в первом случае заголовок объявлен в main и передан как адрес, поэтому после возвращения из функции вставки он должен получить эффект от этой операции вставки, но он работает не так, как обычно, и не дает муравей. / p для функции отображения

1 Ответ

1 голос
/ 12 октября 2019

Проблема в том, что в первом коде insert получает копию указателя main head и изменяет эту копию, заставляя ее указывать на некоторую вновь выделенную память. Эта модификация никогда не распространяется обратно на main.

. Чтобы ее распространить, используйте указатель на указатель:

void insert(struct node **head) {
    struct node *last, *temp;
    *head = (struct node *)malloc(sizeof(struct node));
    printf("Input an integer: ");
    scanf("%d", &(*head)->data);
    (*head)->link = NULL;
    last = *head;
    {
        int n = 3;
        while(n>0){
            temp = (struct node *)malloc(sizeof(struct node));
            printf("Input an integer: ");
            scanf("%d", &temp->data);
            temp->link = NULL;
            last->link = temp;
            last = temp;
            n--;
        }
    }
     return;
}

, а затем, в main, назовите его так:

insert(&head);

В качестве альтернативы, вы могли бы заставить insert взять указатель, но также вернуть указатель (т. Е. Новую голову):

struct node* insert(struct node *head) { ... }

Одна проблема, что этоAPI в том, что он довольно подвержен ошибкам: очень просто вызвать insert() и забыть разобраться с его возвращаемым значением.

...