Linked list, printing looks destructive.
Alain De Vos
devosalain at ymail.com
Mon Apr 25 08:18:22 UTC 2022
On Monday, 25 April 2022 at 05:17:28 UTC, Salih Dincer wrote:
> On Monday, 25 April 2022 at 02:19:46 UTC, Ali Çehreli wrote:
>>
>> This type violates a fundamental rule: Containers and ranges
>> are separate concepts. Your List is a container, not a range.
>> I changed your code by moving the range functions to a Range
>> [...]
>
> Dear Ali,
>
> I implemented a linkedlist over classical logic (*_leaf and
> const *_root). Now seeing the ranges approach I tried it but
> without success. The following implementation can work with
> foreach() though; as long as you call goRoot() :)
>
> ```d
> class List(dType) {
> struct Node
> {
> dType item;
> Node* next;
> }
> bool FIFO;
> private Node * _leaf;
>
> this(bool FIFO = true, dType item = dType.init) {
> this.FIFO = FIFO;
> if(FIFO) _leaf= new Node(item, null);
> _root = cast(const)_leaf;
> }
>
> /*
> auto opSlice() { return Range(_leaf); }
> static struct Range {//*/
> const Node * _root;
>
> auto empty()
> {
> return !_leaf;
> }
>
> auto popFront()
> {
> return _leaf = _leaf.next;
> }
>
> dType front(Node * node = null)
> {
> dType result;
> if(node)
> {
> result = (*node).item;
> } else result = (*_leaf).item;
>
> return result;
> }
> //}
>
> alias Next = popFront;
> alias pop = front;
> alias push = InsertBack;
>
> void InsertBack(dType item)
> {
> _leaf = new Node(item, _leaf);
> }
>
> void InsertFront(dType item)
> {
> (*_leaf).next = new Node(item, null);
> Next;
> }
>
> auto goRoot()
> {
> return _leaf = cast(Node*)_root.next;
> }
> }
>
> import std.stdio;
>
> enum FIFO { False, True }
> enum end = 20;
> void main()
> {
> int firstNumber = 10;
> auto FIFO_Stack = new List!int;
> with(FIFO_Stack)
> {
> do {
> InsertFront(firstNumber);
> } while(++firstNumber <= end);
>
> goRoot();
>
> do pop.writef!" %s"; while(Next);
> writeln;
> }
>
> FIFO_Stack.goRoot();
>
> foreach(stack; FIFO_Stack) {
> stack.writeln;
> }
> } /* OUTPUT:
> 10 11 12 13 14 15 16 17 18 19 20
> 10
> 11
> 12
> 13
> 14
> 15
> 16
> 17
> 18
> 19
> 20
> */
> ```
> SDB at 79
I implemented an alternative goroot it's called re_init and next
program works.
Still I don't understand what is really going on.
Some state is lost using a class and you have restore it.
And the state is not lost using a struct.
```
cat test.d
import std.stdio: write,writeln;
import std.range: empty,popFront,front;
struct Node {
int element;
Node * next;
}
class List {
Node * root=null;
Node * walker=null;
this(int[] AR){foreach(i ; AR)pushfront(i);}
bool empty() const {return !walker;}
void popFront() {walker=walker.next;}
float front() const {return walker.element;}
void pushfront(int element) {
Node * newnode=new Node();
newnode.element=element;
newnode.next=root;
root=newnode;
re_init();
}
void re_init(){walker=root;}
}//List
void main(){
List l=new List([3,2,1]);
l.writeln();
l.re_init();
l.writeln();
}
```
More information about the Digitalmars-d-learn
mailing list