не мог понять, почему head = head-> next работает - PullRequest
0 голосов
/ 14 июля 2020

Я не знаю, почему head = head->next работает, когда мы ничего не сохранили, или NULL в head->next

это две функции 1-я функция принимает аргумент n типа int и создает список, в этой функции мы определяем, что head->next = NULL

, а вторая функция, т.е. deletefirstnode, удаляет первый узел, но в этой функции head->next действительно работает и указывает на другой узел в списке, который мы используем temp->next для доступа к следующему узлу, но почему в этом случае head->next пожалуйста, объясните мне это

void createlist(int n){
    struct node *newnode, *temp;
    int data, i;
    
    head = (struct node*)malloc(sizeof(struct node));
    
    if(head == NULL){
        printf("unable to allocate memory");
    }
    else{
        printf("enter the data of node 1 : ");
        scanf("%d", &data);
        
        head->data = data;
        head->next = NULL;// here is where we define head->next to NULL
        temp = head;
        
        
        for(i=2; i<=n; i++){
            newnode = (struct node*)malloc(sizeof(struct node));
            
            
            if(newnode == NULL){
                printf("unble to allocate memory");
            }
            else{
                printf("enter the data of node %d", i);
                scanf("%d", &data);
                
                newnode->data = data;
                newnode->next = NULL;
                temp->next = newnode;
                temp = temp->next;
            }
        }
        printf("singly linked list created successfully\n");
    }
}


void deletefirstnode(){
    struct node *todelete;
    
    if(head == NULL){
        printf("list is already empty");
    }
    else{
        todelete = head;
        head = head->next;//and why this works now I am confused
        
        printf("\ndata deleted = %d\n", todelete->data);
        
        free(todelete);
        
        printf("successfully deleted the first node from list\n");
    }
}

1 Ответ

0 голосов
/ 17 июля 2020

В заголовке вашей программы вы не объявили голову глобально как NULL, поэтому head указывает где-то в связанном списке, в котором вы ранее использовали head. Если head->next не было NULL, тогда у вашего односвязного списка не будет конца. И для удаления, т.е.

todelete = head;
head = head->next;
free(todelete)

todelete сохраняет адрес head, а затем вы указываете свой head на следующий, чтобы вырезать текущую ссылку head и указать его на следующий адрес, иначе узел, который вы хотите удалить, останется в памяти.

...