因排序代码过多,同样分成两个博文来发表。

 
  
  1. #include <iostream> 
  2. using namespace std; 
  3.  
  4. /* 
  5.     希尔排序的分组是gap(增量)的倍数 
  6.     堆排序的分组是 树(子树)的分组 
  7. */ 
  8. #define MAXSIZE 20 
  9. #define MAXD    8 
  10. typedef int ElemType; 
  11. typedef struct node 
  12.     ElemType data; 
  13.     struct node *next; 
  14. }Node; 
  15.  
  16. void CreateList(Node *&nodes, int iarr[], int len)            //此函数是创建一个单链表 
  17.     int loop1 = 0; 
  18.     Node *temp = NULL, *temp2 = NULL; 
  19.  
  20.     if(nodes != NULL) free(nodes); 
  21.     nodes = (Node *)malloc(sizeof(Node)); 
  22.     nodes->next = NULL; 
  23.     temp2 = nodes; 
  24.  
  25.     for(loop1 = 0; loop1 < len ; ++loop1) 
  26.     { 
  27.         temp = NULL; 
  28.         temp = (Node *)malloc(sizeof(Node)); 
  29.         temp->data = iarr[loop1]; 
  30.         temp->next = temp2->next; 
  31.         temp2->next = temp; 
  32.         temp2 = temp; 
  33.     } 
  34.  
  35. void InsertSort2(Node *&nodes)                       //对单链表进行排序 
  36.     Node *temp = NULL, *node = NULL, *prenode = NULL, *pre = NULL; 
  37.     if(nodes == NULL || nodes->next == NULL ) 
  38.     { cout<<"wrong parameter"<<endl;return ; } 
  39.     else 
  40.     {   pre = nodes; 
  41.         temp = nodes->next; 
  42.          
  43.         prenode = temp->next; 
  44.         node = temp->next; 
  45.         temp->next = NULL;                          //把第三个域的值给置空,   被一个单链表分为两个单链表 
  46.          
  47.         while(prenode != NULL) 
  48.         {  
  49.             node = prenode; 
  50.             pre = nodes; 
  51.             temp = nodes->next;     
  52.             while(temp != NULL && (node->data > temp->data))             //判断的条件的顺序不能颠倒,这一点要谨慎 
  53.             {    
  54.                 pre = temp;     
  55.                 temp = temp->next;  
  56.             }  
  57.             prenode = prenode->next; 
  58.              
  59.             node->next = pre->next; 
  60.             pre->next = node;         
  61.         } 
  62.     } 
  63.  
  64. void Disp(Node *nodes) 
  65.     Node *temp = NULL; 
  66.     if(nodes != NULL) 
  67.     { 
  68.         temp = nodes->next; 
  69.         while(temp != NULL) 
  70.         { 
  71.             cout<<temp->data<<' '
  72.             temp = temp->next; 
  73.         } 
  74.     } 
  75.     cout<<endl; 
  76.  
  77. void Disp(int iarr[], int len) 
  78.     int loop1 = 0; 
  79.     while(loop1 < len) 
  80.     { 
  81.         cout<<iarr[loop1]<<' '
  82.         ++loop1; 
  83.     } 
  84.     cout<<endl; 
  85.  
  86. void Disp(char iarr[][4], int len) 
  87.     int loop1 = 0; 
  88.     while(loop1 < len) 
  89.     { 
  90.         cout<<iarr[loop1]<<' '
  91.         ++loop1; 
  92.     } 
  93.     cout<<endl; 
  94.  
  95.  
  96. void InsertSort(int iarr[], int len)      //此函数是直接插入排序,从数组中得出一个值,把它按照顺序插入到前面的数组中 
  97.     int loop1 = 0, loop2 = 0, loop3 = 0, temp = 0; 
  98.  
  99.     for(loop1 = 1; loop1 < len ; ++loop1)       //循环从1以后的元素 
  100.     { 
  101.         temp = iarr[loop1];                     
  102.  
  103.         for(loop2 = 0; loop2 < loop1 && temp > iarr[loop2]; ++loop2);       //找到要插入的位置 
  104.  
  105.         loop3 = loop1; 
  106.         while(loop3 >= loop2)                        //移动元素 
  107.         { 
  108.             iarr[loop3] = iarr[loop3 - 1]; 
  109.             --loop3; 
  110.         } 
  111.         iarr[loop2] = temp; 
  112.     } 
  113.  
  114. void ShellSort(int iarr[], int len)             //此函数又称为缩小增量, 把记录按下标的一定在增量gap,其中下标值是gap倍数的元素为一组,对这一组元素进行插入排序 
  115. {                                               //每次循环,都把gap缩小到原来的二分之一, 直到其值为0.          主要思想是其分组的方式是把 增量的倍数为一组 
  116.     int loop1 = 0, loop2 = 0, temp = 0, gap = 0; 
  117.      
  118.     gap = len / 2; 
  119.     while(gap > 0) 
  120.     { 
  121.         for(loop1 = gap; loop1 < len ; ++loop1) 
  122.         { 
  123.             temp = iarr[loop1]; 
  124.  
  125.             loop2 = loop1 - gap; 
  126.             while(loop2 >= 0 && iarr[loop2] > temp)            //此循环就相当于一个插入排序 
  127.             { 
  128.                 iarr[loop2 + gap] = iarr[loop2]; 
  129.                 loop2 = loop2 - gap; 
  130.             } 
  131.              
  132.             iarr[loop2 + gap] = temp; 
  133.           
  134.         } 
  135.         gap = gap / 2; 
  136.     } 
  137.  
  138. void SelectSort(int iarr[], int len)                        //此函数是选择,在无序的区间里面选择一个最小的,然后把其置于有序区间的最后 
  139.     int loop1 = 0,loop2 = 0, min = 0, pos = 0;              //min 保存的是最小的值, pos保存的是最小值的下标位置 
  140.  
  141.     for(loop1 = 0; loop1 < len ; ++loop1) 
  142.     {   pos = loop1; 
  143.         min = iarr[loop1]; 
  144.         for(loop2 = loop1 + 1; loop2 < len ; ++loop2) 
  145.             if(min > iarr[loop2]) 
  146.             { min = iarr[loop2];    pos = loop2;} 
  147.      
  148.         iarr[pos]   = iarr[loop1];                            //此处赋值不可整错 
  149.         iarr[loop1] = min; 
  150.     } 
  151.  
  152.  
  153.  
  154. void sift(int iarr[], int low, int high)    //由于堆排序是要把堆化为大根堆或者小根堆, 此函数就是这个功能 
  155.     int loop1 = low, loop2 = low *2 ,value = iarr[low];  
  156.      
  157.     while(loop2 <= high) 
  158.     { 
  159.         if(loop2 < high && iarr[loop2] < iarr[loop2 + 1]) 
  160.             ++loop2; 
  161.         if(value < iarr[loop2])                //这里比较的是最初的iarr[low]的值,如果满足条件的话,就把loop2继续向下深入,因为是数组存储,所以其子节点的下标为 loop2 * 2 
  162.         { 
  163.             iarr[loop1] = iarr[loop2]; 
  164.             loop1 = loop2;                      //loop1 的作用相当于链表中 前驱 
  165.             loop2 = loop2 * 2; 
  166.         }else break
  167.     } 
  168.     iarr[loop1] = value; 
  169.  
  170. void HeapSort(int iarr[], int len)                          //堆排序的思想是,按堆的定义把数组调整为堆(创建初始堆,此后就是大根堆了),然后交换第一个元素与最后一个元素,这样最后一个元素就是最大的值,然后对倒数第二个元素之前的元素进行堆排序,一直重复上个过程即可。 
  171. {                                                   //其中数组的开始是从1 开始的,第0个节点没用 
  172.     int mid = len / 2, loop1 = 0, temp = 0; 
  173.                              
  174.     for(; mid > 0; --mid)       //mid的指向是最后一个 枝节点, 对所有枝节点进行调整为堆。 
  175.         sift(iarr,mid,len); 
  176.      
  177.     for(loop1 = len ; loop1 > 1; --loop1) 
  178.     { 
  179.         temp = iarr[1]; 
  180.         iarr[1] = iarr[loop1]; 
  181.         iarr[loop1] = temp; 
  182.  
  183.         sift(iarr,1,loop1 - 1);                         //此处只执行一次是因为,除了根节点外都是满足大(小)根堆的要求,所以只对根节点进行操作 
  184.     } 
  185.  
  186.  
  187. void sift2(int iarr[], int low, int high) 
  188.     int ivar1 = low, ivar2 = low * 2, tempval = iarr[low]; 
  189.          
  190.     while(ivar2 <= high) 
  191.     { 
  192.         if(ivar2 < high && iarr[ivar2] > iarr[ivar2 + 1])    //此时应该把最小的值放在根节点处 
  193.             ++ivar2; 
  194.          
  195.         if(tempval > iarr[ivar2]) 
  196.         { 
  197.             iarr[ivar1] = iarr[ivar2]; 
  198.             ivar1 = ivar2; 
  199.             ivar2 = 2 * ivar2; 
  200.         }else break;         
  201.     } 
  202.     iarr[ivar1] = tempval; 
  203.  
  204. void HeapSort2(int iarr[], int len)             //此是按照从大到小的顺序排序,即树是一个小根树 
  205.     int loop1 = 0, mid = len / 2, loop2 = 0, temp = 0; 
  206.  
  207.     for(; mid > 0; --mid) 
  208.         sift2(iarr,mid,len); 
  209.  
  210.     for(loop2 = len ; loop2 > 1; --loop2) 
  211.     { 
  212.         temp = iarr[1]; 
  213.         iarr[1] = iarr[loop2]; 
  214.         iarr[loop2] = temp; 
  215.  
  216.         sift2(iarr,1,loop2 - 1); 
  217.     } 
  218.  
  219. bool isSmallHeap(int iarr[], int len)               //判断是否是一个小根堆,如果是的话,那么一个节点的左右子节点的值,都要比其双亲节点的值要大 
  220. {                                                   //要判断数组的长度是为奇数还是偶数, 如果是偶数的话,那么最后一个枝节点就少一个右节点 
  221.     int   loop1 = 0, mid = len / 2; 
  222.     bool isNOdd = false
  223.     if(len % 2 == 0)  isNOdd = true
  224.     for(loop1 = 1; loop1 <= mid ; ++loop1) 
  225.     { 
  226.         if(isNOdd && loop1 == mid) 
  227.         { 
  228.             if(iarr[loop1] < iarr[2 * loop1]) 
  229.                 continue
  230.             else return false
  231.         } 
  232.         else 
  233.         { 
  234.             if(iarr[loop1] < iarr[2 * loop1] && iarr[loop1] < iarr[2 * loop1 + 1]) 
  235.                 continue
  236.             else return false
  237.         } 
  238.     } 
  239.  
  240.     return true
  241.  
  242. void BubbleSort(int iarr[], int len)                        //冒泡排序,把相邻的前后两个元素成为有序 
  243.     int loop1 = 0, loop2 = 0, temp = 0; 
  244.     bool isExchange = false;                                //此变量表示是否交换了数据, 如果没有交换,那么说明其顺序是有序的不需要进行后面的排序操作,直接返回即可 
  245.     for(loop1 = 0; loop1 < len; ++loop1) 
  246.     {   isExchange = false
  247.         for(loop2 = len -1 ; loop2 > loop1 ; --loop2)         //此循环代表一次排序 
  248.         { 
  249.             if(iarr[loop2] < iarr[loop2 - 1]) 
  250.             {     
  251.                 temp = iarr[loop2]; 
  252.                 iarr[loop2] = iarr[loop2 -1]; 
  253.                 iarr[loop2 - 1] = temp; 
  254.                 isExchange = true
  255.             }            
  256.         } 
  257.         if(!isExchange) return ; 
  258.     } 
  259.  
  260. void DBubble(int iarr[], int len)           //双向冒泡排序, 实际上是一个排序区间从两边向中间缩小的过程, 而单个冒泡排序则是从一边向中间缩小的过程 
  261.  
  262.     int loop1 = 0, mid = len / 2, loop2 = 0,temp = 0; 
  263.      
  264.     bool isExchange = false
  265.     for(loop1 = 0; loop1 < mid; ) 
  266.     {   isExchange = false
  267.         for(loop2 = len -1 - loop1; loop2 > loop1; --loop2)          //从后向前循环 
  268.         { 
  269.             if(iarr[loop2] < iarr[loop2 - 1]) 
  270.             { 
  271.                 temp = iarr[loop2]; 
  272.                 iarr[loop2] = iarr[loop2 - 1]; 
  273.                 iarr[loop2 - 1] = temp; 
  274.                 isExchange = true
  275.             } 
  276.         } 
  277.         ++loop1;        //此处++表明上一步骤后loop1已经存放了最终值, 所以不需要继续对其进行排序 
  278.         if(isExchange && loop1 < mid)                           //表示当有交换值并且loop1还没有达到临界的时候 
  279.         { 
  280.             for(loop2 = loop1; loop2 < len - loop1; ++loop2)        //此循环是从未达到最终值的左边开始向右,但是条件是 loop2 < len - loop1,表明后面排过序的元素不再比较 
  281.             { 
  282.                 if(iarr[loop2] > iarr[loop2 + 1]) 
  283.                 { 
  284.                     temp = iarr[loop2]; 
  285.                     iarr[loop2] = iarr[loop2 + 1]; 
  286.                     iarr[loop2 + 1] = temp; 
  287.                 } 
  288.             } 
  289.         }else return ; 
  290.     } 
  291.  
  292.  
  293. void DBubble2(int iarr[], int len)          //此循环同样是一个双向的冒泡排序,不同的是它的循环条件是exchange==1,这样直到一趟排序中没有交换的时候完成全部的排序 
  294.     int loop1 = 0, ivar = 0, temp = 0; 
  295.     int exchange = 1; 
  296.  
  297.     while(exchange == 1) 
  298.     { 
  299.         exchange = 0; 
  300.         for(loop1 = len -1 -ivar; loop1 > ivar; --loop1) 
  301.         { 
  302.             if(iarr[loop1] < iarr[loop1 - 1]) 
  303.             { 
  304.                 temp = iarr[loop1]; 
  305.                 iarr[loop1] = iarr[loop1 - 1]; 
  306.                 iarr[loop1 - 1] = temp; 
  307.                 exchange = 1; 
  308.             } 
  309.         } 
  310.         ++ivar; 
  311.         if(exchange == 1) 
  312.         for(loop1 = ivar; loop1 < len - ivar; ++loop1) 
  313.         { 
  314.             if(iarr[loop1] > iarr[loop1 + 1]) 
  315.             { 
  316.                 temp = iarr[loop1]; 
  317.                 iarr[loop1] = iarr[loop1 + 1]; 
  318.                 iarr[loop1 + 1] = temp; 
  319.             } 
  320.         } 
  321.     } 
  322.  
  323.  
  324. void QuickSort(int iarr[], int begin, int end)          //快速排序的思想是 先取出一个元素,然后从最后一个元素开始向左进行,直到找到一个比取得元素小的元素,把此元素放在取出元素的位置, 
  325. {                                                       //然后从开始出向右进行,找到一个比取出元素大的元素,把其放在右边取出的位置上,  如此循环直到向左的下标与向右的下标相遇,   此时这个下标就是刚开始取得元素的最终位置 
  326.     int temp = iarr[begin], loop1 = begin, loop2 = end - 1;                 //快速排序与冒泡排序一样,每一次循环都要把一个元素放在最终的位置上。 
  327. //      cout<<"loop1 : "<<loop1<<"  loop2 : "<<loop2<<" begin : "<<begin<<" end :"<<end<<endl; 
  328.     if(begin >= end) return
  329.   
  330.     while(loop1 < loop2) 
  331.     { 
  332.         while(loop1 < loop2 && iarr[loop2] > temp) 
  333.             --loop2; 
  334.         if(loop1 < loop2)                           //此处还需要有一个判断,因为上一步的--loop2会使loop2 < loop1 
  335.         {   iarr[loop1] = iarr[loop2]; 
  336.             ++loop1;                                //此处进行++操作,因为原来的值不需要操作 
  337.         } 
  338.           
  339.         while(loop1 < loop2 && iarr[loop1] < temp) 
  340.             ++loop1; 
  341.         if(loop1 < loop2) 
  342.         { 
  343.             iarr[loop2] = iarr[loop1]; 
  344.             --loop2; 
  345.         }         
  346.     } 
  347.  
  348.  cout<<"loop1 : "<<loop1<<"  loop2 : "<<loop2<<endl; 
  349.     iarr[loop1] = temp; 
  350.     QuickSort(iarr,begin, loop1 ); 
  351.     QuickSort(iarr,loop1 + 1, end ); 
  352.  
  353. void QuickSort2(int iarr[], int begin, int end)         //此函数是快速排序的非递归算法,利用一个队列保存每个区间 
  354.     struct 
  355.     { 
  356.         int begin, end; 
  357.     }st[MAXSIZE],temp; 
  358.     int front = -1, rear = -1, ivar1 = 0, ivar2 = 0, tempval = 0; 
  359.  
  360.     ++rear; 
  361.     st[rear].begin = begin; 
  362.     st[rear].end   = end; 
  363.  
  364.     while(front < rear) 
  365.     { 
  366.         ++front; 
  367.         temp = st[front]; 
  368.  
  369.         ivar1 = temp.begin; 
  370.         ivar2 = temp.end - 1; 
  371.  
  372.         if(ivar1 == ivar2) continue;            //当相遇的时候,也就是元素只有一个时,不执行操作 
  373.  
  374.         tempval = iarr[ivar1];                  //此句不能放在while循环内,因为ivar1的值在循环内是变化的 
  375.         while(ivar1 < ivar2) 
  376.         { 
  377. //          cout <<"ivar1  "<<ivar1<<" ivar2: "<<ivar2<<endl; 
  378.             while(ivar2 > ivar1 && iarr[ivar2] > tempval) 
  379.                 --ivar2; 
  380.             if(ivar2 > ivar1) 
  381.             { 
  382.                 iarr[ivar1] = iarr[ivar2]; 
  383.                 ++ivar1; 
  384.             } 
  385. //       cout <<"    iva r1  "<<ivar1<<" ivar2: "<<ivar2<<endl; 
  386.             while(ivar2 > ivar1 && iarr[ivar1] < tempval) 
  387.                 ++ivar1; 
  388.             if(ivar2 > ivar1) 
  389.             { 
  390.                 iarr[ivar2] = iarr[ivar1]; 
  391.                 --ivar2;   
  392.             } 
  393. //           cout <<"             ivar1  "<<ivar1<<" ivar2: "<<ivar2<<endl; 
  394.         }     
  395.         cout<<"ivar1 : "<<ivar1<<"  ivar2 : "<<ivar2<<endl;              //此处ivar2怎么会出现为 -1?? 因为这一句 ivar2 = temp.end - 1;    递归的不存在这个问题因为递归比较的是begin和end的值, 不是loop1 和 loop2的值 
  396.         iarr[ivar1] = tempval;                   //此句不能放在判断语句内,因为这一句总是要执行的 
  397.         if(ivar1 == ivar2)                      //要注意此处的判断条件,当ivar1 == ivar2的时候才表明找到了一个元素的最终位置,最后一定有(ivar1 == ivar2),此判断要 
  398.         { 
  399.             ++rear; 
  400.             st[rear].begin = temp.begin; 
  401.             st[rear].end   = ivar1; 
  402.             ++rear; 
  403.             st[rear].begin = ivar1 + 1; 
  404.             st[rear].end = temp.end; 
  405.         } 
  406.     } 
  407. /* 
  408. void Partition(int iarr[], int begin, int end) 
  409. {// cout<<"begin : "<<begin<<"  end :"<<end<<endl; 
  410.     int temp = 0, ivar1 = begin, ivar2 = end , mid = (ivar1 + ivar2) / 2 , tempval = 0; 
  411.     if(ivar1 >= ivar2) return;  
  412.     temp = iarr[mid]; 
  413.  
  414.     while(ivar1 < ivar2) 
  415.     { 
  416.         while(ivar2 > ivar1 && iarr[ivar2] >= temp) 
  417.             --ivar2; 
  418.         while(ivar2 > ivar1 && iarr[ivar1] <= temp) 
  419.             ++ivar1; 
  420.         if(ivar1 < ivar2) 
  421.         { 
  422.             tempval =  iarr[ivar1]; 
  423.             iarr[ivar1] = iarr[ivar2]; 
  424.             iarr[ivar2] = tempval; 
  425.               
  426.         } 
  427.     }Disp(iarr,12); 
  428.       
  429.     iarr[mid] = iarr[ivar1]; 
  430.     iarr[ivar1] = temp;  
  431. //   system("pause"); 
  432.     Partition(iarr,begin,ivar1 -1);  
  433.     Partition(iarr,ivar1 + 1, end); 
  434. } 
  435.  
  436. void QuickSortX(int iarr[], int begin, int end) 
  437. { 
  438.     int pos = 0; 
  439.      Partition(iarr,begin, end); 
  440.     if(begin < pos -1) 
  441.         QuickSortX(iarr,begin,pos); 
  442.     if(pos + 1 < end - 1) 
  443.         QuickSortX(iarr,pos + 1,end); 
  444. } 
  445. */ 
  446.  
  447. void Merge(int iarr[], int begin, int mid, int end)             //归并,把一个数组的前后两个部分(有序)合并为一个有序的数组 
  448.     int iarr2[MAXSIZE], loop1 = 0, tempmid = 0, count = 0; 
  449.  
  450.     for(loop1 = 0, tempmid = mid + 1; loop1 <= mid && tempmid <= end; ) 
  451.     { 
  452.         if(iarr[loop1] > iarr[tempmid]) 
  453.         { 
  454.             iarr2[count] = iarr[tempmid]; 
  455.             ++tempmid; 
  456.             ++count; 
  457.         }else if(iarr[loop1] < iarr[tempmid]) 
  458.         { 
  459.             iarr2[count] = iarr[loop1]; 
  460.             ++loop1; 
  461.             ++count; 
  462.         }else 
  463.         { 
  464.             iarr2[count] = iarr[loop1]; 
  465.             ++loop1; 
  466.             ++count; 
  467.             iarr2[count] = iarr[tempmid]; 
  468.             ++tempmid; 
  469.             ++count; 
  470.         } 
  471.     } 
  472.     if(loop1 > mid) 
  473.     { 
  474.         while(tempmid <= end) 
  475.         { 
  476.             iarr2[count] = iarr[tempmid]; 
  477.             ++count; 
  478.             ++tempmid; 
  479.         } 
  480.     } 
  481.     if(tempmid > end) 
  482.     { 
  483.         while(loop1 <=  mid) 
  484.         { 
  485.             iarr2[count] = iarr[loop1]; 
  486.             ++count; 
  487.             ++loop1; 
  488.         } 
  489.     } 
  490.     for(loop1 = 0; loop1 <= end; ++loop1) 
  491.         iarr[loop1] = iarr2[loop1]; 
  492.  
  493. void MergePass(int iarr[], int end, int length)      //对一个数组进行一length长度的合并时候,应该判断数组的长度是否为区间的偶数倍或者奇数倍 
  494.     int pos = 0; 
  495.     for(pos = 0; pos + 2 * length -1 <= end; pos = pos + 2 * length) 
  496.         Merge(iarr,pos,pos + length - 1, pos + 2 * length - 1); 
  497.     if(pos + length - 1 < end) 
  498.         Merge(iarr,pos, pos + length -1 , end); 
  499. }  
  500.  
  501. void MergeSort(int iarr[], int len)         //归并排序,其思想是把数组先按照长度为1进行两路排序,然后长度递增 
  502.     int length = 1; 
  503.     for(length = 1; length < len ; length *= 2) 
  504.         MergePass(iarr,len,length); 
  505.  
  506. typedef struct rnode 
  507.     char data[MAXD]; 
  508.     struct rnode *next; 
  509. }RecType; 
  510.  
  511. void RadixSort(char carr[][4], int len, int weishu)             ///基数排序 
  512.     int loop1 = 0, num = 0,count = 0, loop2 = 0; 
  513.     RecType head[MAXSIZE], *tail[MAXSIZE] = {NULL}, *temp = NULL; 
  514.       
  515.     for(count = weishu -1;count >= 0; --count) 
  516.     {  
  517.         for(loop1 = 0; loop1 < MAXSIZE; ++loop1) 
  518.         { 
  519.             tail[loop1] = NULL; 
  520.             head[loop1].next = NULL; 
  521.         } 
  522.           
  523.         for(loop1 = 0; loop1 < len; ++loop1)             //按照位数位置上的数字添加到链表数组中,分配 
  524.         {    
  525.             num = int(carr[loop1][count] - '0');  
  526.             temp = (RecType *)malloc(sizeof(RecType)); 
  527.             strcpy(temp->data, carr[loop1]); 
  528.             temp->next = NULL; 
  529.             if(tail[num] == NULL) 
  530.             {   
  531.                 tail[num] = temp; 
  532.                 head[num].next = tail[num]; 
  533.             }else 
  534.             { 
  535.                 temp->next = tail[num]->next; 
  536.                 tail[num]->next = temp; 
  537.                 tail[num] = temp; 
  538.             } 
  539.         } 
  540.         loop2 = 0; 
  541.         for(loop1 = 0; loop1 < len; ++loop1)            //从链表中收集 
  542.         { 
  543.             if(tail[loop1] == NULL) 
  544.             {cout<<"loop1  "<<loop1<<endl; } 
  545.             else 
  546.             { 
  547.                 temp = head[loop1].next; 
  548.                 while(temp != NULL) 
  549.                 {     
  550.                     strcpy(carr[loop2++],temp->data);                    
  551.                     temp = temp->next; 
  552.                 } 
  553.             } 
  554.         }  
  555.       
  556.         for(loop1 = 0; loop1 <len; ++loop1) 
  557.             cout<<carr[loop1]<<' '
  558.         cout<<endl;  
  559.     }