Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
0 / 0 / 1
Регистрация: 08.12.2013
Сообщений: 38

Отсортировать первую половину списка по убыванию, вторую по возрастанию

21.03.2018, 22:31. Показов 1851. Ответов 3

Студворк — интернет-сервис помощи студентам
Здравствуйте, форумчане.

Есть структура:
C
1
2
3
4
5
typedef struct list
{
    int data;
    struct list *next;
} List;
Как отсортировать первую половину списка по убыванию, а вторую по возрастанию?
Весь список по возрастанию или убыванию отсортировать получается, а вот 50 на 50 никак не могу.
Пожалуйста помогите
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.03.2018, 22:31
Ответы с готовыми решениями:

Отсортировать первую половину массива по возрастанию, а вторую - по убыванию
Массив из 20 целых чисел заполняется случайными числами от -100 до 100, отсортировать его первую половину по возрастанию, а вторую- по...

Отсортировать первую половину массива из N элементов по возрастанию, а вторую по убыванию
написать программу, которая отсортирует первую половину массива из N элементов по возрастанию, а вторую по убыванию

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

3
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
22.03.2018, 07:14
Просто укажите в алгоритме сортировке указатель, за который нельзя выходить - он и будет концом первой половины списка. Конкретнее сказать не могу - не вижу вашего алгоритма сортировки.
0
0 / 0 / 1
Регистрация: 08.12.2013
Сообщений: 38
22.03.2018, 09:26  [ТС]
В общем, вот так пробовал сортировать по возрастанию, но съедает n-е количество элементов.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
List *sort(List *head)
{
    List *new_head = NULL;
 
    while ( head != NULL )
    {
        List *node = head;
        head = head->next;
 
        if ( new_head == NULL || node->data < new_head->data )
        {
            node->next = new_head;
            new_head = node;
        }
        else
        {
            List *current = new_head;
            while ( current->next != NULL && !( node->data < current->next->data ) )
            {                   
                  current = current->next;
            }                
 
            node->next = current->next;
            current->next = node;
        }
    }
    return new_head;
}
0
0 / 0 / 1
Регистрация: 08.12.2013
Сообщений: 38
23.03.2018, 18:03  [ТС]
В общем, сделал по тупому:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
//подсчет длины списка
int Length(struct node* head) 
{
  int count = 0;
  struct node* current = head;
  while (current != NULL) 
  {
    count++;
    current = current->next;
  }
  return(count);
}
//делим список на два подсписка
void FrontBackSplit(struct node* source, struct node** frontRef, struct node** backRef) 
{
 
  int len = Length(source);
  int i;
  struct node* current = source;
  if (len < 2) 
  {
    *frontRef = source;
    *backRef = NULL;
  }
  else 
  {
    int hopCount = (len-1)/2;
    for (i = 0; i<hopCount; i++) 
    {
      current = current->next;
    }
    *frontRef = source;
    *backRef = current->next;
    current->next = NULL;
  }
}
//сортировка пузырьком во возрастанию 
void bubble_sort_list_v(struct node* list_1) {
    struct node * p = NULL;
   
     if (list_1 != NULL) {
        while (list_1->next != NULL) {
            p = list_1->next;
            
            do {
                if (p->number < list_1->number) {
                    int tmp = p->number;
                    p->number = list_1->number;
                    list_1->number = tmp;
                }
                
                p = p->next;
            } while (p != NULL);
            
            list_1 = list_1->next;
        }
    }
}
Затем в основной части:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
int main(int argc, char *argv[])
{
 struct node *head;
 struct node *a;
 struct node *b;
 int i;
 
 head = NULL;
 for( i = 0; i <10; i++) 
 {
   head = addnode((rand() % 100), head);
 }
 printf("\nИсходный список: ");
 print_list(head);
 FrontBackSplit(head, &a, &b); //ф-я разбиения на два подсписка
 bubble_sort_list_v(a); //сортируем списки по возрастанию
 bubble_sort_list_v(b);
 
 for (; a != NULL; a = a->next) // добавляем список а к списку б.
     b = addnode(a->number,b); 
 
 printf("\nРезультат: ");
 print_list(b);
  Free(head);
  Free(a);
  Free(b);
 return 0;
}
Глупый момент в этой части:
C
1
2
 for (; a != NULL; a = a->next) // добавляем список а к списку б.
     b = addnode(a->number,b);
Так как список отсортирован по возрастанию (1,2,3,4,5), а при записи во второй список получается (5,4,3,2,1).
Условие задачи выполняется и вроде все хорошо...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.03.2018, 18:03
Помогаю со студенческими работами здесь

Отсортируйте первую половину массива по возрастанию, а вторую по убыванию
Решите задачи данной группы, оформив решение в виде процедур генерации, вывода и обработки массивов. Предусмотрите в процедуре генерации ...

Первую половину элементов массива упорядочить по убыванию, а вторую – по возрастанию
Из произвольного одномерного массива действительных чисел сформировать массив, в котором первую половину элементов упорядочен по убыванию,...

Отсортировать по возрастанию вторую половину массива
Сортировать по возрастанию вторую половину массива используя void Что не то? #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; ...

Отсортировать первую половину массива размера 2*n по убыванию, а вторую половину - по возрастанию
в одномерном массиве размерностью 2*n отсортируйте первую половину массива по убыванию, а вторую половину - по возрастанию. Можно...

Отсортировать первую половину по возрастанию, а вторую – по убыванию
Заполнить массив из 10 элементов случайными числами в интервале и отсортировать первую половину по возрастанию, а вторую – по убыванию....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru