在C中使用Bucket排序对数组进行排序。关于在链表中插入新元素的代码如何工作的问题
我正在用C编写一个程序,它使用bucketSort对数组进行排序。我的代码有效。我可以打印数据结构,原始数组的每个元素都在正确的“bucket”中。我了解什么是链表以及它是如何工作的。但我不能很好地理解这部分代码是如何工作的在C中使用Bucket排序对数组进行排序。关于在链表中插入新元素的代码如何工作的问题,c,linked-list,bucket-sort,C,Linked List,Bucket Sort,我正在用C编写一个程序,它使用bucketSort对数组进行排序。我的代码有效。我可以打印数据结构,原始数组的每个元素都在正确的“bucket”中。我了解什么是链表以及它是如何工作的。但我不能很好地理解这部分代码是如何工作的 /*If the bucket has already another element, */ else { p -> next
/*If the bucket has already another element, */
else
{
p -> next = buckets[index];
buckets[index] = p;
}
我不太清楚链表的最后一个节点是如何指向NULL来表示链表的结束的
bucketSort函数:
void bucketSort(float arr[], int arr_length)
{
/*Sort an array within elements from [0, 1). We are going to use insertion sort
as a subroutine.
Assume arr contains elements from [0, 1)*/
//Initialize empty buckets.
for (int i = 0; i < NBUCKETS; i++)
{
buckets[i] = NULL;
}
//Fill the buckets with respective elements
for (int i = 0; i < arr_length; i++)
{
node *p = malloc(sizeof(node));
//Check if malloc has succeeded in getting memory
if (p == NULL)
{
printf("Something went wrong!\n");
exit(1);
}
//Get index of element arr[i]
int index = getBucketIndex(arr[i]);
//Assign the element arr[i] to the data structure
p -> data = arr[i];
//If data is the first element of bucket do the following...
if (buckets[index] == NULL)
{
buckets[index] = p;
}
/*If the bucket has already another element, */
else
{
p -> next = buckets[index];
buckets[index] = p;
}
}
void-bucketSort(浮点arr[],整数arr_长度)
{
/*对[0,1]中元素内的数组进行排序。我们将使用插入排序
作为一个子程序。
假设arr包含[0,1]中的元素*/
//初始化空桶。
对于(int i=0;idata=arr[i];
//如果数据是bucket的第一个元素,请执行以下操作。。。
if(bucket[索引]==NULL)
{
桶[指数]=p;
}
/*如果铲斗已经有另一个元件*/
其他的
{
p->next=存储桶[索引];
桶[指数]=p;
}
}
最初创建bucket数组时,所有bucket通常标记为空,如下所示:
bucket[0]->NULL
bucket[1]->NULL
然后假设您想在第一个bucket中插入一个新元素42
p->(42)->?
这是当您运行代码插入第一项时发生的情况(如果您已经将bucket指向NULL
,那么实际上不需要特殊情况):
//bucket[0]->NULL
//p->(42)->?
p->next=bucket[index];//p->(42,NULL)
bucket[index]=p;//bucket[0]->(42,NULL)->NULL
这就是运行代码插入第二项时发生的情况99
:
//bucket[0]->(42)->NULL
//p->(99)->?
p->next=bucket[index];//p->(99)->(42)->NULL
bucket[index]=p;//bucket[0]->(99)->(42)->NULL
换句话说,它只是在列表的开头插入新项(空或其他)
您发布的代码是不安全的,这是绝对正确的。如果bucket当前为空,则没有语句将新项的下一个指针设置为
NULL
,几乎肯定会导致结构损坏
好消息是,如上所述,您可以简单地扔掉
if
块,无条件地执行else
块,假设bucket被正确地初始化为NULL
(如果显式地检查原始代码以确定bucket是否为空,这似乎是基于这一事实).最初创建bucket数组时,所有bucket通常标记为空,如下所示:
bucket[0]->NULL
bucket[1]->NULL
然后假设您想在第一个bucket中插入一个新元素42
p->(42)->?
这是当您运行代码插入第一项时发生的情况(如果您已经将bucket指向NULL
,那么实际上不需要特殊情况):
//bucket[0]->NULL
//p->(42)->?
p->next=bucket[index];//p->(42,NULL)
bucket[index]=p;//bucket[0]->(42,NULL)->NULL
这就是运行代码插入第二项时发生的情况99
:
//bucket[0]->(42)->NULL
//p->(99)->?
p->next=bucket[index];//p->(99)->(42)->NULL
bucket[index]=p;//bucket[0]->(99)->(42)->NULL
换句话说,它只是在列表的开头插入新项(空或其他)
您发布的代码是不安全的,这是绝对正确的。如果bucket当前为空,则没有语句将新项的下一个指针设置为
NULL
,几乎肯定会导致结构损坏
好消息是,如上所述,您可以简单地扔掉if
块,无条件地执行else
块,假设bucket被正确初始化为NULL
(如果显式地检查原始代码以确定bucket是否为空,这似乎是基于这一事实)