/******************************************************************************************************************
文件说明:
采用单链表实现的【链式基数排序】
*******************************************************************************************************************/
#include<iostream>
using namespace std;
/*******************************************************************************************************************
模块说明:
定义单链表的【结点】数据结构
********************************************************************************************************************/
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
/*******************************************************************************************************************
模块说明:
初始化单链表,将单链表初始化为一个空表
********************************************************************************************************************/
void InitList(LinkList& pHead)
{
pHead = (LinkList)std::malloc(sizeof(LNode)); //【1】创建头结点
pHead->next = NULL; //【2】将单链表初始化为空表
}
/*******************************************************************************************************************
模块说明:
单链表的插入操作
********************************************************************************************************************/
void ListInsert(LinkList& pHead,int x)
{
if(pHead==NULL)
{
std::cout<<"【NOTICE】此单链表尚没有初始化,请先初始化单链表!"<<std::endl;
std::system("pause");
std::exit(1);
}
else
{
LNode* pTail = NULL;
LNode* pInsertData = NULL;
pTail = pHead; //【1】pTail始终指向表尾的结点
pInsertData = (LNode*)std::malloc(sizeof(LNode));
pInsertData->data = x;
pInsertData->next = NULL;
while (pTail->next!=NULL)
{
pTail = pTail->next;
}
pTail->next = pInsertData;
}
}
/*******************************************************************************************************************
模块说明:
获得单链表中的第一个结点
********************************************************************************************************************/
LNode* GetFirstLNode(LinkList pHead)
{
if(pHead->next==NULL)
{
std::cout<<"【NOTICE】单链表为空表,获取第一个结点失败!"<<std::endl;
std::system("pause");
std::exit(0);
}
else
{
LNode* pTemp = NULL;
pTemp = pHead->next;
pHead->next = pTemp->next;
return pTemp;
}
}
/*******************************************************************************************************************
模块说明:
在单链表中追加一个结点
********************************************************************************************************************/
void AppendLNode(LinkList& pHead,LNode* insertLNode)
{
if(pHead==NULL)
{
std::cout<<"【NOTICE】此单链表尚没有初始化,请先初始化单链表!"<<std::endl;
std::system("pause");
std::exit(1);
}
else
{
LNode* pTemp = NULL;
pTemp = pHead;
while(pTemp->next!=NULL)
{
pTemp = pTemp->next;
}
pTemp->next = insertLNode;
insertLNode->next = NULL;
}
}
/*******************************************************************************************************************
模块说明:
将所有的子链表链接成一个大的链表
********************************************************************************************************************/
void Total(LinkList& pHead,LinkList pSubHead)
{
LNode* pTemp = NULL;
pTemp = pHead;
while (pTemp->next!=NULL)
{
pTemp = pTemp->next;
}
pTemp->next = pSubHead->next;
}
/*******************************************************************************************************************
模块说明:
********************************************************************************************************************/
int Power(int a,int n)
{
int y;
if(n==0)
return 1;
else
{
y=Power(a,n/2);
y=y*y;
if(n%2==1)
y=y*a;
}
return y;
}
/*******************************************************************************************************************
模块说明:
********************************************************************************************************************/
int GetNum(LNode *p,int i)
{
int data=p->data;
int a;
i--;
a=data/Power(10,i);
return a%10;
}
/*******************************************************************************************************************
模块说明:
链式基数排序的核心模块
参数说明:
[1]LinkList pHead
[2]int iCount--------表示参加排序的整数的最大位数一共有iCount位数字
********************************************************************************************************************/
void RadixSort(LinkList& pHead,int iCount)
{
LinkList pSubHead[10]; //【1】定义10个子链表的头结点
LNode* qTempLNode = NULL;
int k = 0;
int j = 0;
int i = 0;
for(j=1;j<=iCount;j++)
{
for(i=0;i<10;i++)
{
InitList(pSubHead[i]);
}//for i
while (pHead->next!=NULL) //【2】链表从头到尾扫描,并将扫描到的结点脱离链表
{
qTempLNode = GetFirstLNode(pHead); //【3】获得链表上的一个结点
k = GetNum(qTempLNode,j); //【4】取得链表结点第j位的元素值k
AppendLNode(pSubHead[k],qTempLNode); //【5】将该结点链接到10个子链表相应的位置
}
for(i=0;i<10;i++) //【6】将10个子链表从0~9依次连接到pHead结点的后面
{
Total(pHead,pSubHead[i]);
}
}//for j
for(i=0;i<10;i++)
{
delete(pSubHead[i]);
}
}
/*******************************************************************************************************************
模块说明:
遍历单链表,输出单链表中结点的数据
********************************************************************************************************************/
void PrintLinkList(LinkList pHead)
{
LNode* pTemp = NULL;
pTemp = pHead->next;
while(pTemp!=NULL)
{
std::cout<<pTemp->data<<std::endl;
pTemp = pTemp->next;
}
}
void main()
{
LinkList pHead = NULL;
InitList(pHead);
ListInsert(pHead,100);
ListInsert(pHead,10);
ListInsert(pHead,90);
ListInsert(pHead,80);
ListInsert(pHead,70);
ListInsert(pHead,60);
ListInsert(pHead,50);
ListInsert(pHead,40);
ListInsert(pHead,30);
ListInsert(pHead,20);
RadixSort(pHead,4); //表示参加排序的整数最大位数一共有4位数字
PrintLinkList(pHead);
system("pause");
}
【Data_Structure笔记7】排序算法之【链式基数排序】
最新推荐文章于 2021-11-26 14:34:41 发布