链表排序和链表逆序

最近准本系统的学习一下,algorithms in C;所以将自己学习的心得和体会准本和大家分享。欢迎大神批评指导微笑;今天先进入链表这一节。链表可谓是所有数据结构的基础,所以学好链表是一切开始的源泉。

所谓的链表逆序就是将链表反向输出。例如输入:1,2,3,4,5;反向5,4,3,2,1;下面给出程序:大家体会一下

struct node *reverse(struct node *head)
{
	struct node *r = NULL;
	struct node *x, *y;
	y = head->next;   //
	while(y->next != NULL)
	{
		x = y->next;
		y->next = r;
		r = y;
		y = x;
	}
	y->next = r;
	head->next = y;
	return head;

}

链表排序(处于个人爱好和方便,对于每个链表我都会有一个头结点 微笑),链表排序可以采用插入或选择排序比较简单,所以我采用的是选择排序。具体细节程序注释中会有所介绍。

//-------------------------链表排序采用选择排序的思想,当然也可以采用插入排序---------------------------------------------------------
struct node* ListSort(struct node *heada)
{
	struct node *headb;
	struct node *ra1;
	struct node*ra2;  //指向ra1的前去
	struct node *maxpre = NULL;  //指向最大值节点的前趋
	struct node *max;  //指向最大值节点用于向headb中插入;

	headb = (struct node *)malloc(sizeof(struct node));
	headb->next = NULL;

	while(heada->next!= NULL)
	{
		maxpre = heada;
		ra2 = heada;
		ra1 = heada->next;
		while(ra1->next != NULL)
		{
			ra1 = ra1->next;
			ra2 = ra2->next;
			
			if(maxpre->next->data<ra1->data)
			{
				maxpre = ra2;
			}
		}
		//-----------------从heada中将最大值删除----------------------
		max = maxpre->next;
		maxpre->next = max->next;
		max->next = NULL;
		//--------------将最大值插入headb(因为选择的是最大值且是升序排序所以,所以直接在头结点后插入)-------------------------

		max->next = headb->next;
		headb->next = max;
	}
	return headb;
}
链表创建:

void ListCreate(struct node *&head)
{
	struct node *r;
	for(int i = 1; i<= N; i++)
	{
		r= (struct node *)malloc(sizeof(struct node));
		r->data = rand()%50;
		r->next = NULL;
		r->next = head->next;
		head->next = r;
	}
}

main函数:

void main()
{
	struct node *head = (struct node *)malloc(sizeof(struct node));
	head->next = NULL;
	ListCreate(head);
	struct node *r;
	r = head->next;
printf("-------------随机生成链表----------------------\n");
	while(r != NULL)
	{
		printf("%d ",r->data);
		r = r->next;
	}
	printf("\n");

	head = reverse(head);
    printf("---------逆序后的链表----------------\n");
	r = head->next;
	while(r != NULL)
	{
		printf("%d ",r->data);
		r = r->next;
	}
	printf("\n");

	 r = ListSort(head);
printf("------------排序后的链表------------------\n");
	r = r->next;
	while(r != NULL)
	{
		printf("%d ",r->data);
		r = r->next;
	}
	printf("\n");
}
上面程序中少了一个N这是个宏定义节点个数,你可以随意定义一下 微笑



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值