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