2013-10-04 190 views
0

如果没有任何循环和任何递归,我们将得到一个使用c语言实现动态队列的任务。 该队列应包含下一个功能:安装,破坏,添加,删除和偷看。 我认为做一个链接结构,这样每个链接将有一个指针下一个链接等..但问题是,我不知道如何做没有任何循环的破坏函数,唯一的解决方案,我可以想到正在做一个循环,将每个链接发送到删除功能(但是,我需要它没有任何循环)。他们是否有可能在没有任何循环的情况下执行破坏函数?实现一个队列(fifo)

p.s破坏函数应该释放我们用于队列的所有内存。

+2

“无循环”通常意味着:使用递归。没有给出答案就很难做到更精确,我认为这个“使命”就是你的功课。 –

+0

是的,它是功课,我忘了它说没有递归太。有一种方法可以将所有链接保存在内存中的同一个块中,并且只需一次调用费用函数即可释放所有链接? – user2559696

+0

是的,如果你把所有东西放在一个数组中。 –

回答

1

如果递归函数没有计算为约束的循环,则可以使用递归来遍历列表并销毁项目。

另一种方法是将项目存储在数组中,并为队列的头部和尾部维护指向数组的指针。销毁队列意味着释放数组或重置头部/尾部指针,并且不需要循环。

+0

这是正确的,但比我的队列将有一个有限的大小,并将不会动态(它应该)。 – user2559696

+0

@ user2559696不一定,你可以用给定的初始大小的malloc()数组,当它已满时,可以使用realloc()来扩展它。 – nos

1

没有真正需要基于链表进行排队,它将具有随机分配元素的所有缺点和缺乏空间局部性,调试相对困难,并且不会使用主要优点一个链接列表(在O(1)处插入),因为它无论如何都是只有一个插入点的队列(或者对于双端的插入点是2)。

取而代之,您可以使用数组,并保持头部和尾部索引变量,当它们在最后环绕时使用循环增量,并在需要时重新分配。如果队列包含基本数据类型,这也可以让你一次性释放整个队列,只需释放数组(尽管对于必须手动分配的元素,我看不到任何方法来避免迭代删除,除非您移动到C++)。

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 

Destruct:

Free the memory block 

没有循环,没有递归。它使用的事实是,缓冲区只允许在队列的开始/结尾进行更改 - 不可能在中间删除元素。

如果头部和尾部指针相遇,则队列“满”。在这种情况下,“insert”函数应该返回一个错误,除非你添加了一个“插入破坏性”的标志,说“覆盖最旧的元素”。这看起来超出了你家庭作业的范围,但它在现实生活中的应用很重要。有时你关心最古老的数据 - 在其他时候你关心最新的数据。但通常情况下,如果队列填满了,整个系统设计就会出现问题(基本上,你没有扩大排空队列以处理填充速度的过程)。

注意 - 如果队列中的每个元素都是一个指向动态分配内存的指针,则需要遍历所有元素以释放该内存,否则将创建内存泄漏。但是,如果队列大小不变,则不需要。考虑到给定的约束,并且缺少规定队列元素大小应该是可变的,我建议您为固定大小的队列元素编写解决方案。