大家帮忙看看这个问题

jtdream 2005-10-10 10:46:56
下面是一个基数排序的代码,循环中前面是分配,后面是搜集,在搜集过程中,不理解
p->next = NULL; 语句的作用,去掉之后,该程序会占用cpu100%的资源。大家帮我分析一下吧。
我猜想可能是循环链的原因,可以即使出现了循环链,程序也没有遍历这个循环链。谢谢


/* 基数排序的算法源程序*/
#include<stdio.h>

#define D 3 /* D为排序码的最大位数 */
#define R 10 /* R为基数 */

typedef int KeyType;
typedef int DataType;

struct Node; /* 单链表结点类型 */
typedef struct Node RadixNode;

struct Node {
KeyType key[D];
/* DataType info;*/
RadixNode *next;
};

typedef RadixNode * RadixList;

typedef struct QueueNode {
RadixNode *f; /* 队列的头指针 */
RadixNode *e; /* 队列的尾指针 */
} Queue;

Queue queue[R];

void radixSort(RadixList * plist, int d, int r) {
int i,j,k;
RadixNode *p, *head = *plist;

for(j = d-1; j >= 0; j--) { /* 进行d次分配和收集*/
p = head;
for(i = 0; i < r; i++) {
queue[i].f = NULL; queue[i].e = NULL; /* 清队列 */
}

while (p != NULL) {
k = p->key[j]; /* 按排序码的第j个分量进行分配*/
if (queue[k].f == NULL)
queue[k].f = p; /* 若第k个队列为空,则当前记录为队头*/
else (queue[k].e)->next = p;/* 否则当前记录链接到第k队的队尾*/
queue[k].e = p;
p = p->next;
}

for(i = 0; queue[i].f == NULL; i++) /* 找出第一个非空队列*/
;
p = queue[i].e; head = queue[i].f; /* head为收集链表的头指针*/

for(i++; i < r; i++)
if(queue[i].f != NULL) { /* 收集非空队列 */
p->next = queue[i].f;
p = queue[i].e;
}
/////////////////////////////////////////////////
p->next = NULL; //去掉该行之后,cpu就会出现100%的情况。
///////////////////////////////////////////////////
}
(*plist) = head;
}

struct Node element[11]={
0,3,0,NULL,/*36*/
0,0,0,NULL,/*5*/
0,1,0,NULL,/*16*/
0,9,0,NULL,/*98*/
0,9,0,NULL,/*95*/
0,4,0,NULL,/*47*/
0,2,0,NULL,/*32*/
0,3,0,NULL,/*36*/
2,4,0,NULL,/*48*/
2,1,0,NULL, /*10*/
2,2,0,NULL,
};

int main(){
int i;
RadixList p = element;
for (i = 0; i < 10; i++)
element[i].next = &element[i+1];
element[10].next = NULL;
radixSort(&p, 3, 10);

while (p != NULL){
printf("%3d ", p->key[0]*100+p->key[1]*10+p->key[2]);
p = p->next;
}
getchar();
return 0;
}
...全文
92 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
vteliang 2005-10-10
  • 打赏
  • 举报
回复
是队列不是链表
jixingzhong 2005-10-10
  • 打赏
  • 举报
回复
呵呵, 这个是很正常的啊, 变量分配了以后, 其中的初始内容, 在我们进行初始化之前, 是未知的, 不过, 基本上是很难凑巧为 null ,在连表的最后一项,如果没有把这个志向了 next 的指针修改为 null, 那么指针的值将无法预测, radixSort(&p, 3, 10); 函数调用后, while (p != NULL) 这个循环输出的部分, 将进行连续的输出而无法终止 ...
Leomaxking 2005-10-10
  • 打赏
  • 举报
回复
如果没有 p->next = NULL,那
while (p != NULL){
...
}
这个循环还会终止吗?不就形成死循环了。。。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧