问题描述
我正在用 C 编写一个程序,该程序使用 bucketSort 对数组进行排序。我的代码有效。我可以打印数据结构,原始数组的每个元素都在正确的“存储桶”中。我了解链表是什么以及它是如何工作的。但是我不太明白这部分代码是如何工作的。
/*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;
}
}
解决方法
当最初创建bucket数组时,通常所有bucket都被标记为空,如下:
class SearchBar extends React.Component {
onformsubmit(event) {
event.preventDefault();
console.log(this.state.text);
}
state = { text: '' }
render() {
return (
<div className="ui segment">
<form className="ui form" onSubmit={this.onformsubmit}>
<div className="field">
<label>Image Search: </label>
<input type='text'
onChange={(e) => { this.setState({ text: e.target.value }) }} //rerendered
value={this.state.text} // overwrite by state.text
/>
</div>
</form>
</div>
);
}
}
然后假设您想在第一个存储桶中插入一个新元素 buckets[0] -> NULL
buckets[1] -> NULL
。您通过 42
指向它并指向某个随机位置作为其下一个元素:
p
当您运行代码以插入第一项时会发生这种情况(如果您已经拥有指向 p -> (42) -> ?
的存储桶,则实际上不需要特殊情况:
NULL
这就是当您运行代码插入第二个项目 // buckets[0] -> NULL
// p -> (42) -> ?
p -> next = buckets[index]; // p -> (42,NULL)
buckets[index] = p; // buckets[0] -> (42,NULL) -> NULL
时发生的情况:
99
换句话说,它只是在列表的开头(空或其他)插入新项目。
您发布的代码不安全是完全正确的。如果存储桶当前为空,则没有将新项的下一个指针设置为 // buckets[0] -> (42) -> NULL
// p -> (99) -> ?
p -> next = buckets[index]; // p -> (99) -> (42) -> NULL
buckets[index] = p; // buckets[0] -> (99) -> (42) -> NULL
的语句,这几乎肯定会导致结构损坏。
好消息是,如上所述,假设桶正确初始化为NULL
(如果明确检查原始代码以确定存储桶是否为空,这似乎很可能基于原始代码的事实)。