一段算法的问题,请教高手!
下面是一段基数排序的代码。
#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;
第二句只执行一次