Сортировка двусвязного списка пузырьком - C (СИ)
Формулировка задачи:
struct stud{
char num[20];
char tel[15];
char name[20];
int byear;
int bday;
int bmonth;
int year;
int yrs;
int del;
struct stud *next;
struct stud *prev;
};for (i = 0; i < amount; i++)
while (ptr2->next != NULL)
{
if (ptr1->byear > ptr2->byear)
{
ptr2->prev = ptr1->prev;
ptr1->prev = ptr2;
ptr1->next = ptr2->next;
ptr2->next = ptr1;
if (ptr1->next != NULL)
ptr1->next->prev = ptr1;
if (ptr2->prev != NULL)
ptr2->prev->next = ptr2;
}
ptr2 = ptr2->next->next;
ptr2 = ptr2->next;
ptr1 = ptr1->next;
}Решение задачи: «Сортировка двусвязного списка пузырьком»
#include <stdio.h>
#include <stdlib.h>
typedef struct ELEM_
{
struct ELEM_ *next;
int value;
}ELEM;
typedef struct
{
ELEM *cur, *head;
}LIST;
typedef int (*Pfun)( const void *, const void *);
int cmp( const void *a, const void *b )
{
return *( (int * )a ) - *( ( int * )b );
}
void Exchange( LIST *list )
{
ELEM *prev = list->head, *temp;
if( list->cur != list->head )
while( prev->next != list->cur )
prev = prev->next;
temp = list->cur->next;
list->cur->next = temp->next;
temp->next = list->cur;
if( list->cur == list->head )
list->head = temp;
else
prev->next = temp;
}
void BubbleSortList( LIST *list, Pfun fun )
{
int flag = 1;
if( !list->head )
return;
while ( flag )
{
flag = 0;
list->cur = list->head;
while( list->cur->next )
if( fun( &list->cur->value, &list->cur->next->value) > 0)
{
Exchange( list );
flag = 1;
}
else
list->cur = list->cur->next;
}
list->cur = list->head;
}
int Push( LIST *list, int value )
{
ELEM *temp = (ELEM*)malloc( sizeof(ELEM) );
if( !temp ) return 1;
temp->value = value;
if( !list->head )
list->head = temp;
else
{
list->cur = list->head;
while( list->cur->next )
list->cur = list->cur->next;
list->cur->next = temp;
}
temp->next = NULL;
return 0;
}
int Pop( LIST *list )
{
list->cur = list->head;
list->head = list->cur->next;
int value = list->cur->value;
free( list->cur );
return value;
}
int main()
{
LIST head;
head.cur = head.head = NULL;
int mass[] = { 5, -1, 4, 7, 2 , 2,-12,423,12,43, 0,3,1,45,-12,-123
};
for( int i = 0; i < sizeof(mass)/sizeof(mass[0] ); i++ )
Push( &head, mass[i] );
BubbleSortList( &head, cmp );
for( int i = 0; i < sizeof(mass)/sizeof(mass[0] ); i++ )
printf( "%d ", Pop( &head) );
return 0;
}
Объяснение кода листинга программы
В данном коде реализуется сортировка двусвязного списка пузырьком.
Список представляет собой связный список, состоящий из элементов типа ELEM. Каждый элемент списка содержит указатель на следующий элемент (next) и значение (value).
Сортировка осуществляется с помощью функции BubbleSortList, которая принимает указатель на список и функцию сравнения. В данном случае используется функция cmp, которая сравнивает значения двух элементов и возвращает результат сравнения.
В функции BubbleSortList используется цикл while, который продолжается до тех пор, пока в списке остаются элементы. На каждой итерации цикла выполняется проверка: если текущий элемент больше следующего, то они меняются местами с помощью функции Exchange. Флаг flag используется для контроля за каждой итерацией цикла. Если на какой-то итерации обмен не произошел, то это означает, что список уже отсортирован.
Функция Push добавляет новый элемент в список. Если список пуст, то новый элемент становится головой списка. В противном случае новый элемент добавляется в конец списка.
Функция Pop удаляет и возвращает последний элемент списка. После удаления элемента, указатель cur перемещается к предыдущему элементу списка. Если удаленный элемент был последним, то cur становится NULL.
В функции main создается экземпляр списка head. Затем в список добавляются элементы из массива mass с помощью функции Push. После этого вызывается функция BubbleSortList для сортировки списка. Наконец, элементы списка последовательно удаляются с помощью функции Pop и выводятся на экран с помощью функции printf.