链表排序

完整代码: 关键部分的解释看这里

#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;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值