链表的插入排序

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值