单链表的排序

问题: 将无序的单链表按从小到大排序

创新方法: 只对结点存放的值修改。  

思路:建立指针数组,映射到结点存放的值的地址, 然后间接访问这些结点的值,对它们排序。

代码:

预编译 

#include <stdlib.h>
#include <stdio.h>
#define status int
#define FALSE 0
#define TRUE 1

 

采用的链表结构

typedef struct NODE{
    struct NODE *next;    /* 指向下一个结点 */
    int value;            /* 存放结点值 */
} Node, *PNode, **List; 

typedef struct LINK{
    struct NODE *next;    /* 指向下一个结点 */
} Linker;

 

单链表排序

  1 /*
  2 功能描述:
  3     对单链表排序( 从大到小 )
  4 
  5 参数:
  6     p_head -- 链表的头指针
  7 
  8 返回值:
  9      如果排序成功,返回TRUE; 否则, 返回FALSE 
 10 */
 11 status
 12 SortTheChain( Linker *p_head )
 13 {
 14         static int Count( Linker  *p_head );
 15         static status Map( Linker *p_head, int  ***p_index, int node_num );
 16 
 17     int node_num;        /* 存放链表中结点个数 */
 18     int **index = NULL; /* 存放映射 */
 19     int i, j;            /* 分别控制比较的趟数和次数 */
 20     int temp;            
 21 
 22     /* 计算结点个数 */
 23     node_num = Count( p_head );
 24     
 25     /* 映射结点的value字段 */
 26     if ( Map( p_head, &index, node_num ) == FALSE ){
 27         printf( "映射失败\n" );
 28         return FALSE;
 29     }
 30 
 31     /* 排序 */
 32     for ( i = 1; i <= node_num - 1; i ++ ){
 33         for ( j = 0; j < node_num - i; j ++ ){
 34             if ( *index [j] < *index [j + 1] ){
 35                 temp = *index [j];
 36                 *index [j] = *index [j + 1];
 37                 *index [j + 1] = temp;
 38             }
 39         }
 40     }
 41     
 42     /* 释放掉映射 */
 43     free( index );
 44     index = NULL;
 45     return TRUE;
 46 } 
 47 
 48 
 49 /*
 50 功能描述:
 51     计算单链表的长度
 52 
 53 参数:
 54     p_head -- 指向链表的头结点 
 55 
 56 返回值:
 57     返回链表中结点个数 
 58 */
 59 static int 
 60 Count( Linker *p_head )
 61 {
 62     PNode p = NULL;
 63     int num = 0;
 64     
 65     if ( p_head == NULL ){
 66         printf( "链表不存在\n" );
 67         return num;
 68     }
 69 
 70     for ( p = p_head->next; 
 71             p != NULL;
 72             p = p->next ){
 73                 num ++;
 74             }
 75 
 76     return num;    
 77 }
 78 
 79 /*
 80 功能描述:
 81     映射整形指针到单链表value字段的地址 
 82 
 83 参数:
 84     p_head -- 指向头结点  
 85     index -- 指向待映射的整形指针集
 86     node_num -- 链表的结点个数 
 87     
 88 返回值:
 89     如果映射成功, 返回TRUE; 否则, 返回FALSE 
 90 */
 91 static status 
 92 Map( Linker *p_head, int ***p_index, int node_num )
 93 {
 94     int i;
 95     PNode p = NULL;
 96 
 97     /* 申请内存 */
 98     *p_index = (int **) malloc ( node_num * sizeof(int *) );
 99     if ( *p_index == NULL ){
100         printf( "内存不足\n" );
101         return FALSE;
102     }
103     
104     /* 建立映射 */
105     for ( i = 0, p = p_head->next; p != NULL; p = p->next ){
106         (*p_index) [i ++] = &p->value;
107     }
108     return TRUE;
109 }
排序以及需要调用的函数

 

posted @ 2015-07-14 23:20  心中的阿哲  阅读(305)  评论(0编辑  收藏  举报