Проверьте, отсортирован ли связанный список (в порядке возрастания) или нет в C? - PullRequest
0 голосов
/ 14 апреля 2020
struct node* acc_check(struct node *head) {

int count = 0, count2 = 0;
for (struct node *ptr = head; ptr->next != NULL; ptr = ptr->next) {
    count++;
    if (ptr->data <= ptr->next->data) {
        count2++;
    }
}
if (count == count2)
    printf("Ascending Order");
else
    printf("Not in Ascending Order");
return head;

}

Я всегда получаю «По возрастанию», пожалуйста, помогите мне разобраться в проблеме. Вот полный исходный код, СВЯЗАННЫЙ КОД СПИСКА

Ответы [ 2 ]

2 голосов
/ 14 апреля 2020

Если вы внимательно посмотрите на свой код, вы сортируете элементы списка при создании списка:

    case 1: {
        head = create_11(head);
        head = sort_list(head);
    }

Если вы прокомментируете сортировку списка, вы получите ожидаемый результат.

0 голосов
/ 14 апреля 2020

Независимо от того, отсортирован ли список или нет, в любом случае функция неверна.

Для начинающих она может иметь неопределенное поведение, поскольку пользователь может вызвать функцию для пустого списка. В этом случае это выражение

ptr->next != NULL

вызовет неопределенное поведение.

Функция не должна выводить никаких сообщений. Вызывающий функцию решит, выводить ли какое-либо сообщение. Он должен возвращать целочисленное значение либо 0, либо 1, сообщая, является ли список несортированным или отсортированным.

Кроме того, чтобы сделать вывод, что список не отсортирован, нет необходимости проходить его до конца. Переменные count и count2 не имеют смысла. Они являются избыточными.

Функция может быть определена следующим образом.

int acc_check( const struct node *head ) 
{
    if ( head != NULL )
    {
        const struct node *prev = head;
        while ( ( head = head->next ) != NULL && !( head->data < prev->data ) )
        {
            prev = head;
        }
    }

    return head == NULL;
}
...