百万节点的链表,针对各个group排序,输出各组top10的节点(top10是从小到大,取后面最大值top10)

14 篇文章 0 订阅
 一条1百万节点的单向链表,链表所有节点是按value字段从小到大的顺序链接;下面是一个节点的结构 
   typedef struct node_t{ 
int value;   // 节点排序字段 
int group;  //组号: 0,1,2,3,4,5,6,7,8,9 
struct node_t *pnext;  // 下个节点的指针 
}node_t;   

node_t head;    //该单向链表的头节点,全局变量 
    


试设计程序:针对各个group(0-->9),

根据value字段排序,输出各组top 10的节点。(top10是从小到大,取后面的大值top10.) 


#include "stdafx.h"
#include <iostream>
#include<math.h>
#include<malloc.h>
using namespace std;

typedef struct node_t{
 int value;   /* 节点排序字段 */
 int group;   /* 组号: 0,1,2,3,4,5,6,7,8,9 */ 
 struct node_t *pnext;  /* 下个节点的指针 */
 }node_t;     
 node_t *head;    /*该单向链表的头节点,全局变量 */  

void init()//初始化链表
{
 int i;
 node_t *p,*tmp;
 p=(node_t *)malloc(sizeof(node_t));
 head=NULL;
 head=p;
 p->pnext=NULL;
 unsigned int k;
 for(i=0;i<10000;i++)
 {
  tmp=(node_t *)malloc(sizeof(node_t));
  k=rand()%10;
  tmp->value=i;
  tmp->group=k;
  tmp->pnext=p->pnext;
  p->pnext=tmp;
  p=p->pnext;
 }

//算法思想:设置一个10个长度为10的链表来存储group的0-9中每组的top10的value
//并设置含10个元素的数组b[10]作为计数器,统计每个链表的元素的个数,
//当元素个数多于10个时将第一个节点移到最后一个节点,并将取得的改组的值存在最后一个节点
//用含10个元素数组p[10]表示各个链表的表头
//首先遍历到链表的链尾



typedef struct node{
 int value;   /* 节点排序字段 */
 struct node *pnext;  /* 下个节点的指针 */
 }node;    

void sort()
{
   node *a[10];
   node *p[10],*tmp;//tmp作为临时存储器,使用它将表头节点移到表尾;
   node_t *p1=head->pnext;//用p1存给的单链表 
 int i,b[10];
 for(i=0;i<10;i++)b[i]=0;//初始化行计数器
 for(i=0;i<10;i++)//为数组链表分配空间
 {
  a[i]=NULL;
  tmp=(node*)malloc(sizeof(node));
  a[i]=tmp;
  p[i]=a[i];
  a[i]->pnext=NULL;
 }

 while(p1!=NULL)//遍历链表
 {
  for(i=0;i<10;i++)
  {
   if((p1->group)==i)
   {
    if(b[i]<10)
    {
     b[i]++;
     tmp=(node*)malloc(sizeof(node));
     tmp->value=p1->value;
     tmp->pnext=a[i]->pnext;
     a[i]->pnext=tmp;
     a[i]=a[i]->pnext;         
    }
    else
    {
     tmp=p[i]->pnext;
     p[i]->pnext=tmp->pnext;
     tmp->value=p1->value;
     tmp->pnext=a[i]->pnext;
     a[i]->pnext=tmp;
     a[i]=a[i]->pnext;
    }
    
    
   }//end if
  }//end for

  p1=p1->pnext;
 }//end while

cout<<endl;

 //打印*a[10]的值
 for(i=0;i<10;i++)
 {
  cout<<" top "<<i<<":";
  tmp=p[i]->pnext;
  while(tmp!=NULL)
  {
   cout<<tmp->value<<" ";
   tmp=tmp->pnext;
  }
     cout<<endl; 
 }
 //释放内存
 while(head!=NULL)
 {
  p1=head;
  head=head->pnext;
  free(p1);
 }
 for(i=0;i<10;i++)//释放10个数组
 {
  for(i=0;i<10;i++)
  {
  tmp=p[i];
  p[i]=p[i]->pnext;
  free(tmp);
  }
 }

}
 
int main()
{
 
 init();
 sort();
 return 0;
}







  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值