zoukankan      html  css  js  c++  java
  • 26_通过链表排序算法

    #include<stdio.h>
    #include<malloc.h>
    #include <stdio.h>  
    #include <stdlib.h>  
    
    typedef struct Node{
        int data;//数据源
        struct Node* pNext;//指针域 
    }NODE,*PNODE; // NODE等价于struct Node,PNODE等价于struct Node*;
    //函数的声明
    //创建一个非循环的链表 
     PNODE create_list(void){
         int len;//存放结果的数目 
         int val;
         //创建头结点,该头结点不存储数据 
         PNODE pHead = (PNODE)malloc(sizeof(NODE));
         PNODE pTail = pHead; //保证PTail永远指向链表的尾结点 
         pTail->pNext = NULL; 
         if(NULL == pHead){
             printf("程序内存分配失败");
                    exit(-1);
         }
         printf("请输入你要创建节点的数目:");
         scanf("%d",&len);
        for(int i = 0 ;i < len;i++){
             printf("请输入第%d节点的值:",i+1);
             scanf("%d",&val);
             PNODE pNew = (PNODE)malloc(sizeof(NODE));
            if(NULL == pNew){
             printf("程序内存分配失败");
                    exit(-1);
         }
            pNew->data = val;
            pTail->pNext = pNew;
            pNew->pNext = NULL;
            pTail = pNew;
         }
         return  pHead;
          
     }
     
     /*
     判断链表是否为null 
     */
     
     bool isEmpty(PNODE pHead){
         if(pHead->pNext == NULL){//说明链表为空 
             return true;
         }else{
             return false;
         }
     }
     
     /*
     获得链表的长度 
     */
     
     int length_list(PNODE pHead){
         int count = 0;
         PNODE p = pHead->pNext; // 第一个节点不存储数据,所以要移动下一个节点 
         while(NULL != p){//说明该节点不为null 
             int val = p->data; //得到数据 
             p=p->pNext;//p移动到下一个节点        
            count=count+1;   
         }
         return count;
     }
     
     /*
      输出该链表的所有值 
     */
     void printf_list(PNODE pHead){
         PNODE p = pHead->pNext; // 第一个节点不存储数据,所以要移动下一个节点 
         while(NULL != p){//说明该节点不为null 
             int val = p->data; //得到数据 
             printf("%d
    ",val);
             p=p->pNext;//p移动到下一个节点          
         }
         
     }
     /*
     对链表进行排序
     仿造对数组的排序
     for(int i = 0 ; i< len -1 ;i++){
       for( int j = i+ 1; j< len ;j++){
    
      }
    
    }
     
     */
    //单链表的排序   
    void sort_list(PNODE pHead)  
    {  
        int i,j,t;  
        PNODE p=pHead->pNext;  
          
        for(i=0;i<length_list(pHead)-1;i++)  
        {  
            p=pHead->pNext;  
            for(j=0;j<length_list(pHead)-i-1;j++)  
            {  
                if(p->data < p->pNext->data)   //冒泡法,将最小的冒泡到最后,降序排列;   
                {  
                    t=p->data;  
                    p->data = p->pNext->data ;  
                    p->pNext->data = t ;  
                }  
                p=p->pNext;      
            }  
        }  
    } 
    
    /*
    for(i=0;i<n-1;i++)
    
    for(j=i+1;j<n;j++) 
    **/
    void sort_array(int*arr,int len){
    
       int i = 0 ;
       int j = 0 ;
       int temp;
       for(i = 0 ;i< len-1;i++){ //p要执行当前节点的下一个节点 
            for(j = i+1;j<len;j++){
           if(arr[i]>arr[j]) {
            temp=arr[i];
            arr[i]=arr[j];
            arr[j]=temp;
       } 
    }
    }
    
    }
     void print_array(int*arr,int len){
     for(int k = 0; k<len;k++){
           printf("a[%d]=%d
    ",k,*(arr+k));
       }    
     }
    
    int main(){
        PNODE pHead = NULL;//定义一个结构体指针变量
        pHead = create_list(); 
        printf("排序之前的数据是:
    ");
        printf_list(pHead); 
        sort_list(pHead);
        //int arr[5] = {10,80,100,20,50};
    //    print_array(arr,5);
        //sort_array(arr,5);
        //sort_list(pHead);
        printf("排序之后的数据是:
    ");
       printf_list(pHead); 
        //print_array(arr,5);
        return 0;
    }

     程序的运行结果是

  • 相关阅读:
    a标签href不跳转 禁止跳转
    重新安装 tcp/ip协议
    痤疮的治疗
    tuxedo 强制重启
    山西企业主要指标稳步回升 运行渐入平稳轨道
    unix/linux 环境软件调试笔记
    连连看消重算法
    oracle sql developer guide
    取某字段最大值所在的的记录
    食指的《相信未来》
  • 原文地址:https://www.cnblogs.com/kebibuluan/p/6944577.html
Copyright © 2011-2022 走看看