主题:[讨论]简单问题的深度思考
今天在做一个“字符统计”的程序,
在对结果排序之后存放的过程中,我采用用单向链表记录,而其中感觉困惑的地方就是
在下面代码中添加的注释部分,不过感觉这个程序还是不太“利落”
希望和各位高手交流交流
源代码如下:
注: sort函数的主要过程是两层循环,内层循环遍历array数组并从中取最大的那个添加到单向链表中,取完之后将数组中对应的元素置0
struct LIST
{
char c;
short n;
LIST* next;
};
LIST* sort(short* array, int length)
{
LIST* p = NULL;
LIST* q = NULL;
LIST* t = NULL;
LIST HEADER; //这里需要说明一下使用“头”的原因,这样可以避免在循环过程中
//添加判断语句if(i==0){ p = q;},
//否则必须要让q在第一次得到分配的内存后 进行p = q 初始化
//这样就增添了循环过程的复杂度,主要不利于处理器的“预存取指令”
//的工作方式
//当然,不用“头”也行,那需要一开始就malloc()一个头,
//不过这样由于调用了函数,还是比较麻烦的
//能有什么方法解决这个问题呢?
int temp = 0;
int mark = 0;
p = t = &HEADER;
for(int i=0; i<length; i++)
{
temp = array[0];
mark = 0;
for(int j=1; j<length; j++)
{
if(temp < array[j])
{
temp = array[j];
mark = j;
}
}
if(temp == 0 && q == NULL)
return NULL;
if(temp == 0 && q != NULL)
break;
q = (LIST*)malloc(sizeof(LIST));
q->c = 'a' + mark;
q->n = temp;
q->next = NULL;
//if(i == 0)
//{ p = q;}
t->next = q;
t = q;
array[mark] = 0;
}
return p;
}
在对结果排序之后存放的过程中,我采用用单向链表记录,而其中感觉困惑的地方就是
在下面代码中添加的注释部分,不过感觉这个程序还是不太“利落”
希望和各位高手交流交流
源代码如下:
注: sort函数的主要过程是两层循环,内层循环遍历array数组并从中取最大的那个添加到单向链表中,取完之后将数组中对应的元素置0
struct LIST
{
char c;
short n;
LIST* next;
};
LIST* sort(short* array, int length)
{
LIST* p = NULL;
LIST* q = NULL;
LIST* t = NULL;
LIST HEADER; //这里需要说明一下使用“头”的原因,这样可以避免在循环过程中
//添加判断语句if(i==0){ p = q;},
//否则必须要让q在第一次得到分配的内存后 进行p = q 初始化
//这样就增添了循环过程的复杂度,主要不利于处理器的“预存取指令”
//的工作方式
//当然,不用“头”也行,那需要一开始就malloc()一个头,
//不过这样由于调用了函数,还是比较麻烦的
//能有什么方法解决这个问题呢?
int temp = 0;
int mark = 0;
p = t = &HEADER;
for(int i=0; i<length; i++)
{
temp = array[0];
mark = 0;
for(int j=1; j<length; j++)
{
if(temp < array[j])
{
temp = array[j];
mark = j;
}
}
if(temp == 0 && q == NULL)
return NULL;
if(temp == 0 && q != NULL)
break;
q = (LIST*)malloc(sizeof(LIST));
q->c = 'a' + mark;
q->n = temp;
q->next = NULL;
//if(i == 0)
//{ p = q;}
t->next = q;
t = q;
array[mark] = 0;
}
return p;
}