根据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; }
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; }