完整代码: 关键部分的解释看这里
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <time.h>
#include "list1.h"
#define N 1000
void SortList(void);
void swap(node *left, node *middle, node *right);
node *first;
int main(void)
{
node *iterate;
// generate a random sequence
srand(time(NULL));
first = malloc(sizeof(node));
first->n = rand() % 33;
iterate = first;
for (int i = 1; i < N; i++)
{
iterate = iterate->next = malloc(sizeof(node));
iterate->n = rand() % 333;
}
iterate->next = NULL;
// print the sequence and the adress before sort
printf("fisrt->");
for(iterate = first; iterate != NULL; iterate = iterate->next)
printf("(%p, %d)->", iterate, iterate->n);
printf("null\n\n\n");
// sort list
SortList();
printf("fisrt->");
for(iterate = first; iterate != NULL; iterate = iterate->next)
printf("(%p, %d)->", iterate, iterate->n);
printf("null\n");
return 0;
}
void SortList(void)
{
/********************************************************************************************
* 1. "compare" use for compare
* 2. "iterate" use for traversal, alway in front one position of "compare" before compare swap
* 3. "last" use to mark the position which alreay sorted, maybe you can instead by "NULL", but
* the number of comparisons will be times 2
*********************************************************************************************/
node *compare, *iterate, *last;
last = NULL;
while (last != first->next)
{
// first elements as compare, mark(iterate) = NULL
compare = first;
iterate = NULL;
if (compare->n > compare->next->n)
swap(iterate, compare, compare->next);
// not first element as compare, mark(that is iterate) = previous of compare
for (iterate = first; iterate->next->next != last; iterate = iterate->next)
{
compare = iterate->next;
if (compare->n > compare->next->n)
swap(iterate, compare, compare->next);
}
last = iterate->next;
}
}
void swap(node *left, node *middle, node *right)
{
if (left == NULL)
{
first = right;
middle->next = right->next;
right->next = middle;
}
else
{ left->next = right;
middle->next = right->next;
right->next = middle;
}
}