-
Notifications
You must be signed in to change notification settings - Fork 0
/
queuemod.f95
98 lines (79 loc) · 2.06 KB
/
queuemod.f95
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
module queuemod
implicit none
public :: put, einkaufswagen, schlange, init, empty, anstellen, schlange_verkuerzen
type einkaufswagen
integer :: menge
type(einkaufswagen), pointer :: nachfolger
end type einkaufswagen
type schlange
integer :: laenge
type(einkaufswagen), pointer :: head, tail
end type schlange
interface put
module procedure schlange_ausgeben
end interface
contains
subroutine init(s)
type(schlange) :: s
nullify(s%head)
nullify(s%tail)
end subroutine
function empty(s)
type(schlange) :: s
logical :: empty
if(s%laenge == 0) then
empty = .TRUE.
else
empty = .FALSE.
end if
end function empty
subroutine anstellen(s, inhalt)
type(schlange) :: s
integer :: inhalt
if(empty(s)) then
allocate(s%head)
s%head%menge = inhalt
s%tail => s%head
else
allocate(s%tail%nachfolger)
s%tail%nachfolger%menge = inhalt
s%tail => s%tail%nachfolger
end if
!write(*,*) "+Wagen Menge mit Tail ", s%tail%menge
s%laenge = s%laenge + 1
end subroutine anstellen
subroutine schlange_verkuerzen(s)
type(schlange) :: s
type(einkaufswagen), pointer :: hilfe
if(empty(s)) then
write(*,*) "Schlange bereits leer"
else
if(associated(s%head,s%tail)) then !nur noch 1 Kunde in Schlange
deallocate(s%head)
nullify(s%head)
nullify(s%tail)
else
hilfe => s%head%nachfolger
deallocate(s%head)
s%head => hilfe
end if
s%laenge = s%laenge - 1
end if
end subroutine schlange_verkuerzen
subroutine schlange_ausgeben(s)
type(schlange) :: s
integer :: i
type(einkaufswagen), pointer :: ptr
ptr => s%head
if(empty(s)) then
write(*,*) "Schlange leer"
else
do i=1, s%laenge-1
write(*, "(A, 1I3)", advance="no") ' ', ptr%menge
!write(*,*) ptr%menge
ptr => ptr%nachfolger
end do
write(*, "(A, 1I3)", advance="yes") ' ', ptr%menge
end if
end subroutine schlange_ausgeben
end module queuemod