链表递归排序

问题描述

输入以空格隔开的数字,使用链表递归升值排序。如输入:12 5 7 8 9 8 输出:5 7 8 8 9 12


#include <stdio.h>
#include <stdlib.h>
#define LEN sizeof(SNODE)

typedef struct node
{
	int num;
	struct node *next;
}SNODE;

//打印函数
void print(SNODE *head)
{
	head=head->next;
	while(head!=NULL)
	{
		printf("%d ",head->num);
		head=head->next;
	}

	putchar('\n');
}//print

//建表函数
void creatLink(int n,SNODE *head)
{
	SNODE *p,*q;
	p=head;
	while(p->next!=NULL) p=p->next;//找到最后一个节点
	
	q=(SNODE*)malloc(LEN);
	q->num=n;
	q->next=NULL;

	p->next=q;

}//creatLink

//排序函数
SNODE* sortLink(SNODE *head)
{
	SNODE *p=head,*q=head;
	if(head->next!=NULL)	//链表非空
	{
		while(p->next!=NULL)
		{
			if(p->next->num < q->next->num)//查找最小节点
			{
				q=p;			//q指向最小节点的前一个节点
			}
			
			p=p->next;
		}

		p=q->next;				//p指向本轮最小节点
		q->next=q->next->next;	//将本轮最小节点从链表中剔除
		p->next=head->next;	//将原来头节点后的节点接到最小节点的后面
		head->next=p;			//将最小节点接到头节点后面
		sortLink(head->next);	//将最小节点作为头节点进行递归调用
	}
	
	return head;
}//sortLink

int main()
{
	SNODE *head;
	head=(SNODE*)malloc(LEN);//创建头节点
	head->next=NULL;
	head->num=-1;
	int n;
	char c;
	while(1)
	{
		scanf("%d",&n);//读入一个整形
		creatLink(n,head);//加入链表
		c=getchar();//吃掉空格
		if(c=='\n') break;
	}
	print(head);//打印原链表
	sortLink(head);//递归排序
	print(head);//打印排序后的链表
	return 0;
}//main
posted @ 2019-03-16 17:13  DismalSnail  阅读(363)  评论(0编辑  收藏  举报