山东理工OJ【2121】数据结构实验之链表六:有序链表的建立(插排法)
数据结构实验之链表六:有序链表的建立
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
输入N个无序的整数,建立一个有序链表,链表中的结点按照数值非降序排列,输出该有序链表。
输入
第一行输入整数个数N;
第二行输入N个无序的整数。
第二行输入N个无序的整数。
输出
依次输出有序链表的结点值。
示例输入
6
33 6 22 9 44 5
示例输出
5 6 9 22 33 44
提示
不得使用数组!
#include <stdio.h> #include <stdlib.h> struct node { int data; struct node *next; }*head; int main() { head=(struct node*)malloc(sizeof(struct node)); head->next=NULL; int n,i; struct node *p,*q,*r; scanf("%d",&n); p=(struct node*)malloc(sizeof(struct node)); q=(struct node*)malloc(sizeof(struct node));//为当前结点和前驱结点开辟空间 for(i=0; i<n; i++) { r=(struct node*)malloc(sizeof(struct node)); scanf("%d",&r->data); p=head->next; q=head; while(p!=NULL) { if(r->data<p->data) { q->next=r; r->next=p; break; }//若结点r的数据比结点p的数据小,则把r插入到q和p之间; q=p; p=p->next; } if(p==NULL) { q->next=r; r->next=NULL; }//若结点p为NULL,意味着此时r中的数据大于之前的所有数据,就把r插在最后 } p=head->next; while(p!=NULL) { if(p->next==NULL) printf("%d\n",p->data); else printf("%d ",p->data); p=p->next; } return 0; }