#include<iostream>
using namespace std;
typedef struct Node
{
int data;
struct Node *next;
}LNode;
void Initiate(LNode **head)
{
(*head)=(LNode*)malloc(sizeof(LNode));
(*head)->next=NULL;
}
void Insert(LNode *head,int num)
{
if(head==NULL) return;
else
{
LNode *p,*q;
q=head;
p=(LNode *)malloc(sizeof(LNode));
p->data=num;
p->next=NULL;
while(q->next!=NULL)
{
q=q->next;
}
q->next=p;
}
}
LNode * GetFirstNode(LNode *head)//得到第一个结点
{
if(head->next==NULL) return NULL;
else
{
LNode *p;
p=head->next;
head->next=p->next;//通过循环此语句,使head最后指向null
return p;
}
}
void AppendNode(LNode *head,LNode *node)//结点与十个新建指针链接
{
if(head==NULL) return;
else
{
LNode *p;
p=head;
while(p->next!=NULL)//当位中数字有相同的且已经被链表链接的时候
{
p=p->next;
}
p->next=node;
node->next=NULL;
}
}
void Total(LNode *L,LNode *head)//重新与链表head链接
{
LNode *p;
p=L;
while(p->next!=NULL)//在进行了每次的位数的调整后,需要重新与链表head链接,如果第一次链接就不需要p就不需要后移,否则需要
{ //后移到最后一个位置,好指向新的节点
p=p->next;
}
p->next=head->next;
}
int GetNum(LNode *p,int i)//得到每个数位上的数字
{
int data=p->data;
int a,l=0,sum=1;
for(l=0;l<i;l++)//如果是取个位,则除1,%10,十位除10,%10,百位除100,%10
{
sum=sum*10;
}
a=data/sum;
return a%10;
}
//第二个形参表示参加排序的整数最大位数一共有count位数字
void radix_sort(LNode *head,int count)
{
LNode *p[10],*q;
int i,j,k;
for(j=1;j<=count;j++)
{
//十个头结点初始化
for(i=0;i<10;i++)
{
Initiate(&p[i]);
}
//链表从头到尾扫描,并将扫描到的节点脱离链表。
while(head->next!=NULL)
{
q=GetFirstNode(head);
k=GetNum(q,j); //取得链表节点第j位的元素值k
AppendNode(p[k],q); //将该节点连接到10个链表相应的位置
}
//将10个链表从0-9依次连接到head节点后面
for(i=0;i<10;i++)
{
Total(head,p[i]);
}
}
for(i=0;i<10;i++)
{
delete(p[i]);//最后把生成的十个节点空间释放
}
}
void printSL(LNode *head)
{
LNode *p;
p=head->next;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
}
int main()
{
LNode *head;
Initiate(&head);
Insert(head,921);
Insert(head,892);
Insert(head,538);
Insert(head,439);
radix_sort(head,3); //表示参加排序的整数最大位数一共有4位数字
printSL(head);
system("pause");
}
http://blog.csdn.net/u014309268/article/details/39653579
#include <iostream>
#include <stdlib.h>
using namespace std;
typedef struct node
{
int num;
struct node* pnext;
}qnode,*pnode;
pnode init()
{
pnode head;
head=(pnode)malloc(sizeof(qnode));
head->pnext=NULL;
return head;
}
void puts(pnode head,int e)
{
pnode p,q;
if(head==NULL)
return;
else
{
q=head;
p=(pnode)malloc(sizeof(qnode));
p->num=e;
p->pnext=NULL;
while(q->pnext!=NULL)
{
q=q->pnext;
}
q->pnext=p;
}
}
pnode getnode(pnode head)
{
if(head->pnext==NULL)
return NULL;
else
{
pnode p=head->pnext;
head->pnext=p->pnext;
return p;
}
}
int power(pnode head,int j)
{
pnode p=head;
int num_=p->num;
int a,i=0,sum=1;
for(i=0;i<j;i++)
{
sum=sum*10;
}
a=num_/sum;
return a%10;
}
void appendnode(pnode head_,pnode node)
{
if(head_==NULL)
return ;
else
{
pnode p;
p=head_;
while(p->pnext!=NULL)
{
p=p->pnext;
}
p->pnext=node;
node->pnext=NULL;
}
}
void total(pnode head,pnode node)
{
pnode p=head;
while(p->pnext!=NULL)
{
p=p->pnext;
}
p->pnext=node->pnext;
}
void radix(pnode head,int count)
{
pnode a[10],p;
int i,j,q;
for(j=1;j<=count;j++)
{
for(i=0;i<10;i++)
{
a[i]=init();
}
while(head->pnext!=NULL)
{
p=getnode(head);
q=power(p,j);
appendnode(a[q],p);
}
for(i=0;i<10;i++)
{
total(head,a[i]);
}
}
for(i=0;i<10;i++)
{
delete(a[i]);
}
}
void traverse(pnode head)
{
pnode q=head->pnext;
while(q!=NULL)
{
cout<<q->num<<' ';
q=q->pnext;
}
}
int main()
{
pnode head;
head=init();
puts(head,321);
puts(head,892);
puts(head,538);
puts(head,439);
radix(head,3);
traverse(head);
return 0;
}