链表递归排序

问题描述

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

猜你喜欢

转载自www.cnblogs.com/DismalSnail/p/10543179.html