zoukankan      html  css  js  c++  java
  • C语言 插入排序使链表递增

    题目:有一个带头节点的单链表L(节点个数大于1),其中ElemType类型为int,设计一个算法使其递增有序

    分析:

    先构造一个只有头节点和开始数据节点的有序表(只含有一个数据节点的单链表一定是有序的),遍历原单链表余下的节点,知道p==NULL为止,通过比较pre指针下一个节点的数值大小和p节点的大小关系来确定p所插入的位置。方法思想来源于直接插入排序。

    方法的空间复杂度为O(1)

    #include<stdio.h>
    #include<stdlib.h>
    typedef struct node{
        int data;
        struct node *next;
    }Node;
    void creat_LinkList(Node *L,int value[],int n)
    {
        Node *rear=L;
        //尾插法
        for(int i=0;i<n;i++)
        {
            Node *s=(Node *)malloc(sizeof(Node));
            s->data=value[i];
            s->next=NULL;
            rear->next=s;
            rear=s;
        }
    }
    void print(Node *L)
    {
        Node *p=L->next;
        while(p!=NULL)
        {
            printf("%d	",p->data);
            p=p->next;
        }
        printf("
    ");
    }
    void insert_order(Node *L)
    {
        Node *p=L->next;//定义带有效数据的首节点为p
        L->next=NULL;//切断头节点和后面节点的连接,使头节点成为一个新的链表
        Node *after_p=NULL;//定义一个p之后的节点为after_P,便于循环
        
        while(p!=NULL)//插入排序
        {
            after_p=p->next;
            Node *pre=L;//让pre指针沿着新的链表循环,方便比对大小
            while(pre->next!=NULL&&pre->next->data<p->data)//p的节点大于pre所指的节点的数值时,pre后移
                pre=pre->next;
            p->next=pre->next;//头插法插入p节点
            pre->next=p;
            p=after_p;
        }
    }
    int main(){
        int a[]={1,7,6,3,5,2,4,8};
        int n=8;
        Node L={1000,NULL};
        creat_LinkList(&L, a, n);
        insert_order(&L);
        print(&L);
    }

  • 相关阅读:
    Webpack-simple cross-env 不是内部或外部命令问题处理
    Webstorm快捷键整理
    Maven导入ojdbc14.jar和ojdbc6.jar
    spring配置datasource三种方式 数据库连接池
    oracle存储过程中使用execute immediate执行sql报ora-01031权限不足的问题
    Java String内存释放
    Sublime Text 3 添加到右键菜单
    Oracle date 和 timestamp 区别
    查看JVM内存使用情况
    bzoj1513【POI2006】Tet-Tetris 3D
  • 原文地址:https://www.cnblogs.com/oldfish123/p/13652363.html
Copyright © 2011-2022 走看看