Рубрики

Структуры данных | Связанный список | Вопрос 5

Следующая функция reverse () должна перевернуть односвязный список. В конце функции отсутствует одна строка.

/ * Узел списка ссылок * /

struct node

{

    int data;

    struct node* next;

};

  
/ * head_ref - это двойной указатель, который указывает на указатель головы (или начала)

  связанного списка * /

static void reverse(struct node** head_ref)

{

    struct node* prev   = NULL;

    struct node* current = *head_ref;

    struct node* next;

    while (current != NULL)

    {

        next  = current->next;  

        current->next = prev;   

        prev = current;

        current = next;

    }

    / * ДОБАВИТЬ ЗАЯВЛЕНИЕ ЗДЕСЬ * /

}

  

Что следует добавить вместо «/ * ДОБАВИТЬ ЗАЯВЛЕНИЕ ЗДЕСЬ * /», чтобы функция правильно переворачивала связанный список.
(A) * head_ref = пред;
(B) * head_ref = текущий;
(C) * head_ref = следующий;
(D) * head_ref = NULL;

Ответ: (А)
Пояснение: * head_ref = пред;

В конце цикла while указатель prev указывает на последний узел исходного связанного списка. Нам нужно изменить * head_ref так, чтобы указатель головы теперь начинал указывать на последний узел.

Смотрите следующую полную запущенную программу .

#include<stdio.h>
#include<stdlib.h>

   
/ * Узел списка ссылок * /

struct node

{

    int data;

    struct node* next;

};

   
/ * Функция перевернуть связанный список * /

static void reverse(struct node** head_ref)

{

    struct node* prev   = NULL;

    struct node* current = *head_ref;

    struct node* next;

    while (current != NULL)

    {

        next  = current->next;  

        current->next = prev;   

        prev = current;

        current = next;

    }

    *head_ref = prev;

}

   
/ * Функция подтолкнуть узел * /

void push(struct node** head_ref, int new_data)

{

    / * выделить узел * /

    struct node* new_node =

            (struct node*) malloc(sizeof(struct node));

              

    / * вставить данные * /

    new_node->data  = new_data;

                  

    / * связать старый список с новым узлом * /

    new_node->next = (*head_ref);    

          

    / * переместить голову, чтобы указать на новый узел * /

    (*head_ref)    = new_node;

}

   
/ * Функция для печати связанного списка * /

void printList(struct node *head)

{

    struct node *temp = head;

    while(temp != NULL)

    {

        printf("%d  ", temp->data);    

        temp = temp->next;  

    }

}    

   
/ * Сушилка для проверки вышеуказанной функции * /

int main()

{

    / * Начнем с пустого списка * /

    struct node* head = NULL;

     

     push(&head, 20);

     push(&head, 4);

     push(&head, 15); 

     push(&head, 85);      

       

     printList(head);    

     reverse(&head);                      

     printf("\n Reversed Linked list \n");

     printList(head);    

     return 0;

}

Рекомендуемые посты:

Структуры данных | Связанный список | Вопрос 5

0.00 (0%) 0 votes