基数排序(链表)

来源:互联网 发布:淘宝网天猫女装冬装 编辑:程序博客网 时间:2024/06/05 10:10
#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;}


0 0
原创粉丝点击