Queue/Definition: Difference between revisions

Content deleted Content added
→‎{{header|C}}: stripped usage (see FIFO(usage))
fortran
Line 594: Line 594:
head @ @ head @ next head ! -1 used +! ;
head @ @ head @ next head ! -1 used +! ;
</lang>
</lang>

=={{header|Fortran}}==
{{works with|Fortran|90 and later}}

See [[FIFO (usage)]] for an example of <code>fifo_nodes</code>

<lang fortran>module FIFO
use fifo_nodes
! fifo_nodes must define the type fifo_node, with the two field
! next and valid, for queue handling, while the field datum depends
! on the usage (see [[FIFO (usage)]] for an example)
! type fifo_node
! integer :: datum
! ! the next part is not variable and must be present
! type(fifo_node), pointer :: next
! logical :: valid
! end type fifo_node

type fifo_head
type(fifo_node), pointer :: head, tail
end type fifo_head

contains

subroutine new_fifo(h)
type(fifo_head), intent(out) :: h
nullify(h%head)
nullify(h%tail)
end subroutine new_fifo

subroutine fifo_enqueue(h, n)
type(fifo_head), intent(inout) :: h
type(fifo_node), intent(inout), target :: n

if ( associated(h%tail) ) then
h%tail%next => n
h%tail => n
else
h%tail => n
h%head => n
end if

nullify(n%next)
end subroutine fifo_enqueue

subroutine fifo_dequeue(h, n)
type(fifo_head), intent(inout) :: h
type(fifo_node), intent(out), target :: n

if ( associated(h%head) ) then
n = h%head
if ( associated(n%next) ) then
h%head => n%next
else
nullify(h%head)
nullify(h%tail)
end if
n%valid = .true.
else
n%valid = .false.
end if
nullify(n%next)
end subroutine fifo_dequeue

function fifo_isempty(h) result(r)
logical :: r
type(fifo_head), intent(in) :: h
if ( associated(h%head) ) then
r = .false.
else
r = .true.
end if
end function fifo_isempty

end module FIFO</lang>


=={{header|Haskell}}==
=={{header|Haskell}}==