我被赋予了使用c语言实现动态队列的任务,没有任何循环和任何递归。 队列应包含下一个功能:安装,破坏,添加,删除和查看。 我想要建立一个链接结构,这样每个链接都会有一个指针指向下一个链接等等。但问题是我不知道如何在没有任何循环的情况下执行析构函数,这是我能想到的唯一解决方案正在制作一个循环,将每个链接发送到删除功能(但同样,我需要它没有任何循环)。他们是否有可能在没有任何循环的情况下进行破坏功能?
p.sdestruct函数应该释放我们用于队列的所有内存。
答案 0 :(得分:1)
如果递归函数不计为约束的循环,则可以使用递归遍历列表并销毁项目。
另一种方法是将项存储在数组中,并维护指向队列头部和尾部的数组的指针。销毁队列只是意味着释放数组或重置头/尾指针,不需要循环。
答案 1 :(得分:1)
没有必要根据链表创建队列,它会有随机分配元素的所有缺点和缺乏空间局部性,调试会相对困难,并且不会使用主要的好处。链表(在O(1)处插入),因为它是一个只有一个插入点的队列(或者是双端的一个)。
相反,您可以使用数组,并维护头部和尾部索引变量,在最后回绕时使用循环递增,并在需要时重新分配。如果队列包含基本数据类型,这也允许您一次性释放整个队列,只需释放数组(尽管对于必须手动分配的元素,我看不到任何方法来避免迭代删除,除非你移动到c ++)。
答案 2 :(得分:0)
我假设要插入内存的项目大小不变。如果需要,它可以是指向内存块的指针。在这种情况下,您可以使用带有头尾指针的循环缓冲区。当任一指针“到达块的末尾”时,它应该换行 - 即你递增/递减modulo queue size
。
初始化:
Create a memory space of finite size (max size of the buffer)
添加:
Update memory location at the current tail (if add to end)
or head (if add to beginning), and update the tail/head pointer.
卸下:
Read the data at the head/tail, and update the pointer
皮克:
Read the data at the head/tail, and don't move the pointer
自毁:
Free the memory block
没有循环,没有递归。它使用FIFO
缓冲区仅允许在队列的开头/结尾进行更改的事实 - 不可能删除“在中间”的元素。
如果头部和尾部指针相遇,则队列为“满”。在这种情况下,“插入”函数应返回错误,除非您添加“插入破坏性”标记,表示“覆盖最旧的元素”。这似乎超出了作业的范围,但在现实生活中很重要。有时您关心最旧的数据 - 有时您关心最新的数据。但通常情况下,如果您的队列正在填满,那么整个系统设计就会出现问题(您没有扩展清空队列以处理填充速率的过程,基本上)。
注意 - 如果队列中的每个元素都是指向动态分配内存的指针,则需要迭代所有元素以释放该内存,否则您将创建内存泄漏。但如果队列大小不变,则不需要这样做。鉴于给出的约束条件以及缺少队列元素大小应该可变的规范,我建议您为固定大小的队列元素编写解决方案。