单链表的排序

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

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

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

代码:

预编译 

#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 }
排序以及需要调用的函数

 

你可能感兴趣的:(单链表)