读书人

数据结构 基数排序 为什么运行后不断刷

发布时间: 2012-03-14 12:01:12 作者: rapoo

数据结构 基数排序 为什么运行后不断刷屏? 求高手指教(严蔚敏算法的实现,几乎一致,运行出错)
#include <stdio.h>

#define MAX_NUM_OF_KEY 3 //关键字项数的最大值
#define RADIX 10 //关键字基数,此时是十进制整数的基数
#define MAX_SPACE 100

typedef struct
{
int keys[MAX_NUM_OF_KEY]; //关键字
int next;
}SLCell; //静态链表结点类型

typedef struct
{
SLCell r[MAX_SPACE]; //静态链表可利用空间,r[0]为头结点
int keynum; //记录当前关键字个数
int recnum; //静态链表当前长度
}SLList;

typedef int ArrType[RADIX];

void Distribute(SLCell *r,int i,ArrType &f,ArrType &e);
void Collect(SLCell *r,int i,ArrType f,ArrType e);
void RadixSort(SLList &L);

int main()
{
SLList L;int i;
L.keynum=3;L.recnum=10;
L.r[1].keys[0]=5;L.r[1].keys[1]=0;L.r[1].keys[2]=3;
L.r[2].keys[0]=0;L.r[2].keys[1]=8;L.r[2].keys[2]=7;
L.r[3].keys[0]=5;L.r[3].keys[1]=1;L.r[3].keys[2]=2;
L.r[4].keys[0]=0;L.r[4].keys[1]=6;L.r[4].keys[2]=1;
L.r[5].keys[0]=9;L.r[5].keys[1]=0;L.r[5].keys[2]=8;
L.r[6].keys[0]=1;L.r[6].keys[1]=7;L.r[6].keys[2]=0;
L.r[7].keys[0]=8;L.r[7].keys[1]=9;L.r[7].keys[2]=7;
L.r[8].keys[0]=2;L.r[8].keys[1]=7;L.r[8].keys[2]=5;
L.r[9].keys[0]=6;L.r[9].keys[1]=5;L.r[9].keys[2]=3;
L.r[10].keys[0]=4;L.r[10].keys[1]=2;L.r[10].keys[2]=6;
RadixSort(L);
for(i=L.r[0].next;i<L.recnum;i=L.r[i].next)
{
printf("%d%d%d \n",L.r[i].keys[0],L.r[i].keys[1],L.r[i].keys[2]);
}

return 0;
}

void Distribute(SLCell *r,int i,ArrType &f,ArrType &e)//分配算法
{
int j,p;
for(j=0;j<RADIX;++j) f[j]=0; //f和e分别指向各子表第一个和最后一个记录
for(p=r[0].next;p;p=r[p].next)
{
j=r[p].keys[i];
if(!f[j]) f[j]=p;
else r[e[j]].next=p; //将p所指结点插入第j个子表中
e[j]=p;
}

}

void Collect(SLCell *r,int i,ArrType f,ArrType e)//收集算法
{
int j,t;
for(j=0;!f[j];j++); //找第一个非空子表
r[0].next=f[j];t=e[j];
while(j<RADIX)
{
for(++j;j<RADIX-1&&!f[j];j++);
if(f[j]) {r[t].next=f[j];t=e[j];} //链接两个非空子表
}
r[t].next=0;
}

void RadixSort(SLList &L)
{
int i;ArrType f, e; //L是采用静态链表表示的顺序表
for(i=0;i<L.recnum;++i)
{
L.r[i].next=i+1;
}
L.r[L.recnum].next=0;
for(i=0;i<L.keynum;++i)
{
Distribute(L.r,i,f,e);
Collect(L.r,i,f,e);
}
}



[解决办法]

C/C++ code
#include <stdio.h>#define MAX_NUM_OF_KEY 3 //关键字项数的最大值#define RADIX 10 //关键字基数,此时是十进制整数的基数#define MAX_SPACE 100   typedef struct{  int keys[MAX_NUM_OF_KEY]; //关键字  int next;}SLCell; //静态链表结点类型   typedef struct{  SLCell r[MAX_SPACE]; //静态链表可利用空间,r[0]为头结点  int keynum; //记录当前关键字个数  int recnum; //静态链表当前长度}SLList;struct listNode{    int data [MAX_NUM_OF_KEY] ;    listNode * next;};struct list{    listNode * head;    listNode * tail;    void insert(int * a)    {        listNode * temp = (listNode *)malloc(sizeof(listNode));        temp->data[0] = a[0];        temp->data[1] = a[1];        temp->data[2] = a[2];        if(head == NULL)        {            head = temp;            tail = temp;            head->next = NULL;            tail->next = NULL;        }        else        {            tail->next = temp;            temp->next = NULL;        }    }    void clear()    {        if(head == NULL) return;        listNode * temp = head;        while(temp != NULL)        {            listNode * n = temp->next;            temp->next = NULL;            free(temp);            temp = n;        }    }}; 


[解决办法]
稍微改写了下,我觉得楼主的程序对于初学者理解基数排序来说有点抽象
next各种杯具
不如新开额外的空间来存储临时数据
再行合并也不费事
我c/c++功底不行
程序中有内存泄漏
不清楚如何判断list数组是否初始化,
求指导
[解决办法]
楼上有神人。。。。

读书人网 >软件架构设计

热点推荐