#include<stdio.h>
#include<stdlib.h>
#include<math.h>
typedef struct LNode{
int data;
struct LNode *next;
}*List;
List createLinkList()
{
List L,pnew,prear;//定义三个指针,一个是头节点,一个是记录前驱节点的指针,一个是用来记录新节点的指针
int i;//定义一个计数器
L=(List)malloc(sizeof(struct LNode));//创建头节点
prear=L;//将头节点的值赋值给prear
for(i=0;i<10;i++)//创建十个随机数
{
pnew=(List)malloc(sizeof(struct LNode));//创建一个新的节点
pnew->data=rand()%100;//产生一个随机数
prear->next=pnew;让新节点连接到当前的链表上面
prear=pnew;//记录当前的节点
}
prear->next=NULL;//尾节点指向为空
return L;//返回头节点
}
void output(List L){
List p;//定义一个用来记录的节点
if(L){//当头节点为空的时候
p=L->next;//指向它的后一个节点
while(p){//当指向的为空时打印输入
printf("%-4d",p->data);//打印输出,以右边对齐
p=p->next;//指针后移
}
printf("\n");//打印换行
}
}
void inserSort(List L){
List p,q,tmp;//定义一个三个指针,第一个用来记录元链表,第二个用来指向新链表的前驱节点,第三个是用来记录插入节点
if(L->next==NULL||L->next->next==NULL){//当它只有一个元素,或者元素为空时返回0
return 0;
}
p=L;//指向头节点
tmp=L->next->next;//指向第一个有效节点的下一个节点
L->next->next=NULL;//断开与旧节点的连接
while(tmp){//当没有数据的时候退出循环
q=tmp->next;//纪录旧后一个节点
while(p->next&&p->next->data<tmp->data){//当指向最后一个节点为空或者满足比当前节点大时退出循环
p=p->next;
}
tmp->next=p->next;//指向要插入节点的后一个节点
p->next=tmp;//前驱节点指向tmp
tmp=q;//重新赋值q
p=L;//重新赋值p
}
output(L);
}
int main(){
List head;//定义头节点
head=createLinkList();//创建链表
inserSort(head);//排序之后的打印输出
return 0;
}