Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中使用Bucket排序对数组进行排序。关于在链表中插入新元素的代码如何工作的问题_C_Linked List_Bucket Sort - Fatal编程技术网

在C中使用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

我正在用C编写一个程序,它使用bucketSort对数组进行排序。我的代码有效。我可以打印数据结构,原始数组的每个元素都在正确的“bucket”中。我了解什么是链表以及它是如何工作的。但我不能很好地理解这部分代码是如何工作的

/*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是否为空,这似乎是基于这一事实)