- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我需要在C语言中编程队列结构来分配任务。节点有一个指向下一个节点和值的指针(到目前为止,是正常的)。但是,由于我需要在线程中使用它,我将malloc堆中的所有容量。
但是,节点和队列的定义如下:
//Element of a queue
struct queue_node {
// Pointer to next element in the queue
struct queue_node* next;
// Value/Data of the queue element
int value;
};
// Queue data structure
struct queue {
// Head of the linked list
struct queue_node* head;
// Max capacity of the queue
int capacity;
// Current size of the queue. size <= capacity, always
int size;
};
struct queue* queue_new(int capacity){
struct queue_node* head1 = malloc(sizeof(struct queue_node)*capacity);
struct queue* ret = malloc(sizeof(struct queue));
/*
struct queue_node head2;
head2.next = NULL;
(*head1) = head2;
*/
(*head1).next = NULL;
(*ret).head = head1;
(*ret).size = 0;
(*ret).capacity = capacity;
return ret;
}
void queue_delete(struct queue* queue){
free((*queue).head);
free(queue);
}
int queue_push_back(struct queue* queue, int value){
if((*queue).size >= (*queue).capacity){
return -1;
}else if((*queue).size == 0){
(*(*queue).head).value = value;
(*queue).size++;
return (*queue).size;
} else{
if((*(*queue).head).next == NULL){ ////((*queue).head + sizeof(struct queue_node))
printf("Intern queue size 1: %d\n", (*queue).size);
(*(*queue).head).next = ((*queue).head + sizeof(struct queue_node));
printf("Error here?\n");
(*(*(*queue).head).next).value = value;
printf("Error here 2?\n");
(*(*(*queue).head).next).next = NULL;
printf("Error here 3?\n");
printf("Intern queue size 2: %d\n", (*queue).size);
printf("Intern queue capacity: %d\n", (*queue).capacity);
(*queue).size++;
return (*queue).size;
}
}
最佳答案
你似乎在尝试混合两种不同的方法来解决这个问题:
将队列维护为数组,并且
将队列维护为链接列表。
为一个块中的全部节点分配空间,将队列头保持在块的开头,实际上首先具有固定的队列容量,这些都是类数组使用的特征。另一方面,具有带有“next”指针的元素节点结构是链表的形式。
如果您将队列作为一个数组来管理,那么next
指针是多余的,如果您实际使用它们的话,它们确实在收缩。相反,您始终可以通过指向节点块开头的指针和节点索引来标识和导航到节点:my_queue_ptr->head[node_num]
。您还可以根据队列的当前大小标识下一个可用节点:my_queue_ptr->head[my_queue_ptr->size]
。
但是,每当您将一个节点出列时,您必须将所有其他节点(或者至少是它们的数据)向前移动一个位置。如果你移动整个节点,那么你就把它们的next
指针搞砸了,因为每个指向位置的东西都不同,而且与以前的不同,有着不同的意义。
另一方面,如果将队列作为链表管理,则在一个块中分配所有节点是没有意义的。相反,传统的做法是为每个入队列的值分配一个新节点,并取消分配每个出队列的值的节点。在这种情况下,您将在第一个元素排队和任何元素出列时修改队列的head
指针。如果您没有维护指向当前尾部的指针(目前您没有),那么每次将元素排队时,您都需要遍历列表以找到尾部节点,并在那里追加新节点。
更新:
如果您仍然继续您所描述的内容,那么对我来说唯一有意义的方法就是采用基于数组的方法,并且完全忽略数据结构的链表方面。您提供的queue_new()
和queue_delete()
函数对此是合理的。另一方面,您的queue_push_back()
甚至在内部都不一致,更不适合使用类似数组的方法。
不过,在开始之前,我要详细说明一下,我想指出的是,您的代码不必要地难以阅读。当然,这里已经介绍了->
操作符;它是专门为方便使用指向结构的指针而设计的,特别是方便使用指向结构的指针链。这里是queue_push_back()
函数的第一部分,重写为使用->
;显示的部分完全等同于原始函数的相应部分:
int queue_push_back(struct queue* queue, int value){
if (queue->size >= queue->capacity) {
return -1;
} else if (queue->size == 0) {
queue->head->value = value;
queue->size++;
return queue->size;
} else {
// ...
}
value
。您没有设置它的
next
指针。如果您理解我的建议,那么您将认识到这实际上很好——您将使用数组中的索引来访问元素,而不是链接,这最多是多余的。
next
指针的值,这是您从未设置过的。未定义的行为结果。现在您可以管理这些链接并使用它们(尽管如果您希望支持容量大于2的队列,您需要比现在更复杂的东西),但是正如我所说,我的建议是完全忽略这些链接。
queue->head[queue->size]
:
queue->head[queue->size].value = value;
queue->size++;
queue->size == 0
时)也会被我刚才介绍的代码很好地服务;它根本不需要特殊情况:
int queue_push_back(struct queue* queue, int value){
if (queue->size >= queue->capacity) {
return -1;
} else {
queue->head[queue->size].value = value;
return ++queue->size;
}
// That's all, folks!
}
关于c - 为什么我要覆盖我的结构?实现队列,但是行不通,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44075535/
我正在尝试实现这个简单的幻灯片:http://codepen.io/rafaelcastrocouto/pen/doZNMo 但我没有成功,我不知道问题是什么,唯一显示的是幻灯片的最后一张图片,我添加
我对 Promise 还很陌生,我认为我没有正确理解它,因为我在代码中尝试它但没有成功。 我在 NodeJS 上有一个服务器,使用 Express 库和 express-promise var exp
为什么两个盒子都在右边,而不是居中对齐? fiddle :http://jsfiddle.net/gh76q/1/ 我尝试将方框 2 的位置更改为相对位置,它可以解决问题,但当鼠标悬停在方框 1 上时
这个问题在这里已经有了答案: scanf() leaves the newline character in the buffer (7 个答案) 关闭 4 年前。 如果我尝试这样的事情: int
这个问题在这里已经有了答案: scanf() leaves the newline character in the buffer (7 个答案) 关闭 4 年前。 如果我尝试这样的事情: int
我有一张我的小 table ,它似乎不起作用。 CSS 会告诉所有我想要的高度和宽度。我这样做的方式有误吗?或者我错过了什么? 为什么不是所有的边界都对齐? 表格、html 和 CSS 可以在这个 j
我正在尝试使用localStorage制作一个简单的程序。我创建了一个按钮来重置 localStorage 中的所有数据。不幸的是,它不起作用,我不知道为什么。 这是我的代码: var sl
我有一个 Div,我想做的是,当您将鼠标悬停在 div 1 上时,它会更改 div 2。 所以我可以通过 .div1:hover .div2 的 CSS 来做到这一点,这意味着当我将鼠标悬停在 1 上
出于某种原因,比较逻辑无法正常工作……它不会比较两个 NSDecimalNumber 对象。有时有效,有时无效。真的很奇怪。 if 语句适用于某些编译,有时则不然。这是正确的做法吗? 数据来自一个 j
我在 iOS 上使用 Phonegap 2.1.0。在我的 main.html 文件中,我使用 jQuery 加载了一些 html。 但是,我正在加载的其中一个 html 文件有自己的 Javascr
行不通,而嵌套
我一般不会嵌套像这样: The following: one two 我将使用 像那样嵌套反而。但是今天我用了但似乎 Emacs 和 Google Chrome 都会考虑外部 一看
我有 3 个框 (div-s)。 main-box里面有两个盒子。第一个 (Box1) 向右浮动,另一个 (Box2) 向左浮动。 两个框的高度都设置为 100%,所以当其中一个拉伸(stretch)
我是一名优秀的程序员,十分优秀!