问题描述
输入以空格隔开的数字,使用链表递归升值排序。如输入: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