首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

数据结构 基数排序 为什么运行后不断刷屏? (严蔚敏算法的实现,几乎一致,运行出错)

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

数据结构 基数排序 为什么运行后不断刷屏? 求高手指教(严蔚敏算法的实现,几乎一致,运行出错)
#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数组是否初始化,
求指导
[解决办法]
楼上有神人。。。。

热点排行