Forum » Overige programmeertalen » [c#] double linked list
Berichten: 135
avatar
Offline Stuur privebericht
Beste mede forumers,

Ik zoek jullie hulp voor mijn probleem. Door mijn docent programmeren is het aangeraden om eens uit te zoeken hoe een double linked list werkt, en deze vervolgens uit te programmeren zodat ik een voorsprong kan op bouwen voor komend jaar aangezien we dan een binary tree moeten uit programmeren om zo kennis over algoritmes op te doen.

In theorie lijkt de double linked list helemaal niet zo moeilijk, maar in de praktijk valt het toch wel een stukje tegen. De eerste 2 nodes gingen vrij makkelijk omdat ik de logica hiervan zag

Mijn probleem waar ik tegen aan loop is dat ik niet hoe ik nou kan zien of een getal achter gezet moet worden(hind) of voor gezet moet worden (fore) of ergens tussen gezet moet worden (tween)

Wat ik van plan ben te doen is 2 listboxjes, 1 met random getallen en de ander met de door de linked list gesorteerde uitkomst.

Ik hoop dat iemand de moeite wil en zou kunnen nemen om mij met dit probleem te helpen.

Hier mijn klasse cnode
Code | Selecteer Alles
minimaliseren
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
class cNode
    
{
        public static 
cNode[] nar;
        public 
cNode pLpR;
        public 
int pw;

        public static 
cNode v,m,a;

        public 
cNode(cNode Lint wcNode R)
        {
            
pL L;
            
pR R;
            
pw w;
        }

        public static 
void mTween(int x)
        {
             
//nog verder uit te programeren
        
}

        public static 
void mFore(int x)
        {
            
m.pL nar[x];
            
nar[x].pR m;
            
nar[x];

        }
        public static 
void mHind(int x)
        {
            
m.pR nar[x];
            
nar[x].pL m;
        }

    }


Hier onder mijn implementatie van c# double linked list.
Code | Selecteer Alles
minimaliseren
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
//clear zooi
            
lbU.Items.Clear();
            
lbS.Items.Clear();
            
//WAT TE DOEN
            //vul linker random

            
Random r = new Random();
            
int n 4;
            for (
int T 0nT++)
            {
                
lbU.Items.Add(r.Next(010));
            }

            
//make dllist en voeg alle items in
            
cNode.nar = new cNode[n];
            
//MAAK nulde NODE (VOORSTE)
            
cNode.nar[0] = new cNode(null, (int)lbU.Items[0], null);
            
cNode.cNode.nar[0];
            
cNode.cNode.v;
            
cNode.cNode.v;
            
//rest nodes aanmaken en plaatsen
            //maak node 1
            
int tpw = (int)lbU.Items[1];
            
cNode.nar[1] = new cNode(null,tpwnull);
            
//fore, hind
            
if (tpw cNode.v.pw)
            {
                
//groter
                
cNode.mHind(1);
            }
            else
            {
                
//kleiner of gelijk
                
cNode.mFore(1);
            }
            
//loop langs rest
            //2e en verder
            
for (int i 2ni++)
            {
                
int pw = (int)lbU.Items[i];

                
cNode.nar[i] = new cNode(null, (int)lbU.Items[i], null);
                
                while (
cNode.m.pR != null)
                {
                    if (
pw cNode.m.pw && cNode.m.pR != null)
                    {
                        
cNode.cNode.m.pR;
                    }
                }
            }


            
//******
            //uitlezen;
            
for (cNode.cNode.vcNode.m.pR != nullcNode.cNode.m.pR)
            {
                
lbS.Items.Add(cNode.m.pw);
            }
            
lbS.Items.Add(cNode.m.pw);

Laatst gewijzigd door glennox op 2012-01-24 23:52:34
24-01-2012 23:41
Dit topic is 180 keer bekeken door 46 verschillende leden
Reacties op: "[c#] double linked list"
1
Vreemd
Berichten: 1246
avatar
Offline Stuur privébericht
Een linked list is een opject dat een verwijzing heeft naar de eerste node van de lijst die het voorstelt. Elke node heeft een verwijzing naar de volgende node in de lijst. Handig voor een stack bijvoorbeeld.

Een doubly linked list is een linked list waar elke node een verwijzing naar de volgende EN vorrige node heeft. Je list object verwijst dus nog steeds naar de eerste node.

Een double ended list is een list object waar je naar zowel de eerste en de laatste node van de lijst een verwijzing bevat. Erg fijn voor een queue.

Hier kun je natuurlijk wanneer gewenst gesorteerde varianten van maken. Bij het inserten van een nieuwe waarde in de lijst begin je bij de eerste node op de lijst.
- Als de nieuwe waarde kleiner (of hoe je de lijst wilt sorteren) is zet je list.first in newNode.next waarna je list.first overschrijft met newNode. (mFore())
- Als de nieuwe waarde groter is loop je door de list tot het niet zo is en stop je de nieuwe tussen de twee nodes.
- Als de nieuwe waarde groter is dan elke andere waarde in je lijst voeg je een nieuwe node toe op het eind.

Het eerste wat mij opvalt is dat jij de node en list gecombineerd hebt. Het tweede is dat je variabele geen beschrijvende naam geeft. (Of ik ken C# conventies niet.)
Als je een gesorteerde list wilt hebben, dan wil je niet dat programmeurs zelf methods als mFore() mTween() en mHind() aan kunnen roepen. Of toegang hebben tot pL en pR. Al snap ik dat je nu alleen wilt leren hoe het werkt.

Je kunt hier een voorbeeldje aan nemen
Code | Selecteer Alles
minimaliseren
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
class LinkedList {

    public 
Node first null;

    public 
void insert(int value)
    {
        
Node newNode = new Node(value);

        if (
first == null)
        {
            
first newNode;
            return;
        }

        
newNode.next first;
        
first newNode;
    }
}

class 
SortedLinkedList LinkedList {

    public 
void insert(int value)
    {
        if (
first == null || value first.value)
        {
            return 
base.insert(value);
        }

        
Node newNode = new Node(value);
        
Node current first;

        while (
current.next != null)
        {
            if (
value current.next.value)
            {
                
newNode.next current.next;
                
current.next newNode;
                return;
            }

            
current current.next;
        }

        
current.next newNode;
    }
}

class 
Node {

    public 
int value;
    public 
Node next null;

    public 
Node(int v)
    {
        
value v;
    }
}

Ps. ik ben onder andere bekend met JAVA, PHP en C niet met C# al heb ik wel snel wat dingen opgezocht. Ik ga niet garanderen dat er geen fouten in zitten en het gaat ook vooral om het idee.
25-01-2012 17:31
Reageer op: "[c#] double linked list"
1
Je kan niet reageren omdat je niet bent ingelogd. Inloggen of Aanmelden