Doubly-linked list/Element removal: Difference between revisions
Content added Content deleted
Line 190: | Line 190: | ||
Then deleting node2 yields: |
Then deleting node2 yields: |
||
1 -> 4 |
1 -> 4 |
||
</pre> |
|||
=={{header|Phix}}== |
|||
Extended copy of [[Doubly-linked_list/Traversal#Phix]] |
|||
<lang Phix>enum NEXT,PREV,DATA |
|||
constant empty_dll = {{1,1}} |
|||
sequence dll = empty_dll |
|||
procedure remove_item(integer pos) |
|||
if pos<=1 or pos>length(dll) then ?9/0 end if -- (sanity check) |
|||
integer {next,prev} = dll[pos] |
|||
dll[prev][NEXT] = next |
|||
dll[next][PREV] = prev |
|||
if pos<length(dll) then |
|||
dll[pos] = dll[$] |
|||
{next,prev} = dll[pos] |
|||
dll[prev][NEXT] = pos |
|||
dll[next][PREV] = pos |
|||
end if |
|||
dll = dll[1..-2] |
|||
end procedure |
|||
procedure insert_after(object data, integer pos=1) |
|||
integer prv = dll[pos][PREV] |
|||
dll = append(dll,{pos,prv,data}) |
|||
if prv!=0 then |
|||
dll[prv][NEXT] = length(dll) |
|||
end if |
|||
dll[pos][PREV] = length(dll) |
|||
end procedure |
|||
insert_after("ONE") |
|||
insert_after("TWO") |
|||
insert_after("THREE") |
|||
?dll |
|||
procedure show(integer d) |
|||
integer idx = dll[1][d] |
|||
while idx!=1 do |
|||
?dll[idx][DATA] |
|||
idx = dll[idx][d] |
|||
end while |
|||
end procedure |
|||
show(NEXT) |
|||
?"==" |
|||
show(PREV) |
|||
while length(dll)>1 do |
|||
?"== removing one item ==" |
|||
remove_item(rand(length(dll)-1)+1) |
|||
show(NEXT) |
|||
?"==" |
|||
show(PREV) |
|||
end while</lang> |
|||
{{out}} |
|||
<pre> |
|||
{{2,4},{3,1,"ONE"},{4,2,"TWO"},{1,3,"THREE"}} |
|||
"ONE" |
|||
"TWO" |
|||
"THREE" |
|||
"==" |
|||
"THREE" |
|||
"TWO" |
|||
"ONE" |
|||
"== removing one item ==" |
|||
"ONE" |
|||
"THREE" |
|||
"==" |
|||
"THREE" |
|||
"ONE" |
|||
"== removing one item ==" |
|||
"THREE" |
|||
"==" |
|||
"THREE" |
|||
"== removing one item ==" |
|||
"==" |
|||
</pre> |
</pre> |