首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

一段算法的有关问题,

2012-03-06 
一段算法的问题,请教高手!下面是一段基数排序的代码。#definemaxsize20#include conio.htypedefstruct{in

一段算法的问题,请教高手!
下面是一段基数排序的代码。
#define   maxsize   20  
#include <conio.h>  
typedef   struct   {  
int   key;  
}rcdtype;   ----请问为什么定义rcdtype再用它定义r[maxsize+1]呢?
typedef   struct   {  
rcdtype   r[maxsize+1];  
int   length;  
}sqlist;  

/*表的创建*/  
void   create(sqlist   *l)  
{int   i;  
printf( "\nTo   create   a   list,tell   me   the   length: ");  
scanf( "%d ",&l-> length);  
printf( "Now   input   the   list: ");  
for(i=1;i <=l-> length;i++)  
scanf( "%d ",&l-> r[i].key);  
}  
/*表的输出*/  
void   play(sqlist   l)  
{int   i;  
printf( "The   list   is: ");  
for(i=1;i <=l.length;i++)  
printf( "%d   ",l.r[i].key);  
}  
/*基数排序*/  
#define   max_num_of_key   8  
#define   radix   10  
#define   max_space   100  
typedef   struct{  
char   keys[max_num_of_key];  
int   next;  
}slcell;  
typedef   struct{  
slcell   r[max_space];  
int   keynum;  
int   recnum;  
}sllist;  
typedef   int   arraytype[radix];  
void   transform1(sqlist   s,sllist   *l)  
{int   i;  
l-> keynum=3;l-> recnum=s.length;  
for(i=1;i <=s.length;i++)  
{l-> r[i].keys[2]=s.r[i].key/100;  
l-> r[i].keys[1]=s.r[i].key/10-10*l-> r[i].keys[2];  
l-> r[i].keys[0]=s.r[i].key%10;  
}  
for(i=0;i <l-> recnum;i++)  
l-> r[i].next=i+1;  
l-> r[i].next=0;  
}  
void   transform2(sqlist   *s,sllist   l)  
{int   i,j;  
for(i=1,j=l.r[0].next;i <=l.recnum;i++,j=l.r[j].next)  
s-> r[i].key=100*l.r[j].keys[2]+10*l.r[j].keys[1]+l.r[j].keys[0];  
}  
void   distribute(slcell   *r,int   i,arraytype   f,arraytype   e)  
{int   j,p;  
for(j=0;j <radix;j++){f[j]=0;e[j]=0;}  
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;  
e[j]=p;  
}  
}  
void   collect(slcell   *r,arraytype   f,arraytype   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]&&j <radix){r[t].next=f[j];t=e[j];}  
}  
r[t].next=0;  
}  


void   radixsort(sqlist   *s)  
{sllist   l;  
arraytype   f,e;  
int   i;  
transform1(*s,&l);  
for(i=0;i <l.keynum;i++)  
{distribute(l.r,i,f,e);  
collect(l.r,f,e);  
}  
transform2(s,l);  
}  
/*测试主函数*/  
main()  
{int   c=1;  
sqlist   l;  
clrscr();  
create(&l);  
radixsort(&l);  
play(l);  
getch();  
}

------解决方案--------------------


rcdtype r[maxsize+1];
-----------------
定义一个以rcdtype为结构类型的数组,大小为maxsize+1


typedef struct {
int key;
}rcdtype; ----请问为什么定义rcdtype再用它定义r[maxsize+1]呢?
typedef struct {
rcdtype r[maxsize+1];
int length;
}sqlist;

-------------------
看看上面的定义,rcdtype里只有一个int key,估计这样做的目的是用rcdtype作为一个别名
[解决办法]
----请问为什么定义rcdtype再用它定义r[maxsize+1]呢?

一是可扩展性,如果将来rcdtype包括了除key外的其他内容, 原代码无需任何修改;
二是可支持操作符重载, 而内置的数据类型如int等不支持重载;
三是习惯成自然,学编程时,看过不少大师级程序员的代码都是这么写,也就跟着写了。
...
[解决办法]
在C++里的东西
void Show();
void Show(int i);
void Show(char i);
void Show(int i, char j);
.................
编写以上的几个函数
可以根据参数的不同来确定调用的函数

[解决办法]
楼上已经有人说了,为了扩展或修改方便,顺便也体现一下结构体(也可能只是编程习惯)

后面的问题
for(i=0;i <l-> recnum;i++)
l-> r[i].next=i+1;
l-> r[i].next=0;
第二句只执行一次

热点排行