问题描述
输入以空格隔开的数字,使用链表递归升值排序。如输入:12 5 7 8 9 8 输出:5 7 8 8 9 12
#include #include #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;}//sortLinkint 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