Doubly linked list C#

Status
Niet open voor verdere reacties.

jangge

Gebruiker
Lid geworden
16 jan 2013
Berichten
15
Hoi,

Ik wil graag een array (10) uit een listbox sorten d.m.v. doubly linked list, deze code word soms met succes doorlopen, maar hij kan ook crashen...? ik kom er maar niet achter waar de fout zit.

Alvast bedankt

Code:
001	//Button sort
002	 
003	        private void button1_Click(object sender, EventArgs e)
004	        {
005	            lbS.Items.Clear();
006	            lbU.Items.Clear();
007	            // n = lengte van array
008	            int n = 10;
009	            int[] iar = new int[n];
010	            Random r = new Random();
011	            for (int i = 0; i < n; i++)
012	            {
013	                iar[i] = r.Next(0, 20);
014	                lbU.Items.Add(iar[i]);
015	            }
016	            iar = cDLL.mDLL(iar);
017	            for (int i = 0; i < n; i++)
018	            {
019	                lbS.Items.Add(iar[i]);
020	            }
021	 
022	//class cDLL
023	 
024	namespace 
025	{
026	    class cDLL
027	    {
028	        // v = voor (before)
029	        // o = opslag (temp)
030	        //nAR = node array
031	        // L = linker (left)
032	        // M = midden (middle)
033	        // R = rechter (right)
034	 
035	        private static cDLL v, o;
036	        private static cDLL[] nAR;
037	        private cDLL L;
038	        private int M;
039	        private cDLL R;
040	 
041	        //constructor
042	        private cDLL(cDLL pL, int v, cDLL pR)
043	 
044	        // pL pointer left
045	        // M = meeloper (v) (walker)
046	        // pR pointer right
047	        {
048	             
049	            L = pL;
050	            M = v;
051	            R = pR;
052	        }
053	        public static int[] mDLL(int[] iar)
054	        {
055	            //iar = int array
056	            //n = length of int array iar         
057	            int n = iar.Length;
058	 
059	            nAR = new cDLL[n];
060	            //node array [0] = new cdll null <- [0] ->null
061	            nAR[0] = new cDLL(null, iar[0], null);
062	 
063	            v = nAR[0]; o = v;
064	            nAR[1] = new cDLL(null, iar[0], null);
065	            if (iar[1] >= iar[0])
066	            {
067	                //infront
068	                nAR[0].R = nAR[1];
069	                nAR[1].L = nAR[0];
070	            }
071	            else
072	            {
073	                //behind
074	                nAR[0].L = nAR[1];
075	                nAR[1].R = nAR[0];
076	                v = nAR[1];
077	            }
078	            for (int i = 2; i < n; i++)
079	            {
080	                nAR[i] = new cDLL(null, iar[i], null);
081	                o = v;
082	                while (nAR[i].M > o.M)
083	                {
084	                    if (o.R != null)
085	                    {
086	                        o = o.R;
087	                    }
088	                    else
089	                    {
090	                        nAR[i].L = o;
091	                        o.R = nAR[i];
092	                        break;
093	                    }
094	                }
095	 
096	                if (v == o)
097	                {
098	                    o.L = nAR[i];
099	                    nAR[i].R = o;
100	                    v = nAR[i];
101	                }
102	                else
103	                {
104	                    o.L.R = nAR[i];
105	                    nAR[i].L = o.L;
106	                    o.L = nAR[i];
107	                    nAR[i].R = o;
108	                }
109	 
110	            }
111	 
112	            for (int i = 0; i < iar.Length; i++)
113	            {
114	                iar[i] = v.M;
115	                v = v.R;
116	            }
117	            return iar;
118	        }
119	    }
120	}
 
Laatst bewerkt:
Dag Jangge,

Wat is de melding die je er bij krijgt? Of is er sprake van crashen dat het programma vastloopt?

Vriendelijke groet,

Bart
 
Dag Jangge,

Wat is de melding die je er bij krijgt? Of is er sprake van crashen dat het programma vastloopt?

Vriendelijke groet,

Bart

Hoi Bart,

Ik krijg inderdaad geen error maar het progamma "freezed" blijft waarschijnlijk in een loop hangen.

Soms sorteerd die het wel en som "freezed" die dus.
 
Hij zal vast lopen in de while loop, probeer dat stukje eens te debuggen en kijk goed naar de waardes. Met al je variable names wordt het er niet gemakkelijker op :P


061 nAR[0] = new cDLL(null, iar[0], null);
062
063 v = nAR[0]; o = v;
064 nAR[1] = new cDLL(null, iar[0], null); <--- is index 0 hier correct?


Bij het maken is gewoon een voorgebakken array handiger te gebruiken in plaats van random.
Gebruik eens bijvoorbeeld array 11, 9, 7, 5, 3, 1 en kijk een of je deze getallen ook allemaal terug krijgt.
 
Hij zal vast lopen in de while loop, probeer dat stukje eens te debuggen en kijk goed naar de waardes. Met al je variable names wordt het er niet gemakkelijker op :P





Bij het maken is gewoon een voorgebakken array handiger te gebruiken in plaats van random.
Gebruik eens bijvoorbeeld array 11, 9, 7, 5, 3, 1 en kijk een of je deze getallen ook allemaal terug krijgt.

Hoi,

Bedankt voor je reactie, je hebt inderdaad gelijk dat het een beetje onoverzichtelijk word met al die variabelen:p
dat idee van een static idee kan best werken, en kan verklaren waarom die sommige getallen wel sorteert en soms freezed.

Maar ik kom er even niet op hoe je van een static array één variable maakt?

In ieder geval bedankt dat je meedenkt!
 
het gaat er meer om dat het zo lastig te lezen is (voor iemand anders dan de persoon die het heeft gemaakt) met je variable names, vergelijk je originele class eens met deze:

Zelf voor je zelf zou je na 2 weken al goed moeten kijken wat alle variablen waren en geen/minder comments nodig als de variable naam duidelijk is.

Refactored:
[CPP]public class DoubleLinkedList
{
private readonly int _walkerValue;
private DoubleLinkedList _previous;
private DoubleLinkedList _next;

private DoubleLinkedList(int walkerValue, DoubleLinkedList previous, DoubleLinkedList next)
{
_walkerValue = walkerValue;
_previous = previous;
_next = next;
}

public static int[] SortAscending(int[] arrayParameter)
{
if (arrayParameter == null)
throw new ArgumentNullException("arrayParameter");

if (arrayParameter.Length < 2) //nothing to do if the array doesn't contain atleast 2 items
return arrayParameter;

DoubleLinkedList[] nodeArray = new DoubleLinkedList[arrayParameter.Length];

nodeArray[0] = new DoubleLinkedList(arrayParameter[0], null, null);
nodeArray[1] = new DoubleLinkedList(arrayParameter[1], null, null);

DoubleLinkedList before = nodeArray[0];

if (arrayParameter[1] >= arrayParameter[0])
{
//infront
nodeArray[0]._next = nodeArray[1];
nodeArray[1]._previous = nodeArray[0];
}
else
{
//behind
nodeArray[0]._previous = nodeArray[1];
nodeArray[1]._next = nodeArray[0];
before = nodeArray[1];
}

for (int i = 2; i < arrayParameter.Length; i++)
{
DoubleLinkedList tempStorage = before;

nodeArray = new DoubleLinkedList(arrayParameter, null, null);

while (nodeArray._walkerValue > tempStorage._walkerValue)
{
if (tempStorage._next != null)
{
tempStorage = tempStorage._next;
}
else
{
nodeArray._previous = tempStorage;
tempStorage._next = nodeArray;
break;
}
}

if (before == tempStorage)
{
tempStorage._previous = nodeArray;
nodeArray._next = tempStorage;
before = nodeArray;
}
else
{
tempStorage._previous._next = nodeArray;
nodeArray._previous = tempStorage._previous;
tempStorage._previous = nodeArray;
nodeArray._next = tempStorage;
}

}

for (int i = 0; i < arrayParameter.Length; i++)
{
arrayParameter = before._walkerValue;
before = before._next;
}

return arrayParameter;
}
}[/CPP]


Wat ik heb gedaan is dingen een andere, duidelijke naar gegeven zodat ik het zelf gewoon nog een beetje kon volgen :P
(en dus een index van 0 naar 1 veranderd zoals ik in de vorige post aangaf)

Test in console (niet veel getest, maar zo te zien werkt het)

kbyef6.png
 
@Blooshed

Woow super bedankt man, ik zat zelf ook al te klooien met comments voor me variabelen omdat ik zelf ook soms even moest denken wat ik er mee bedoelde. Je had gelijk die index waarde was verkeerd.

Echt hartstikke bedankt voor je moeite, dit heeft me enorm geholpen!
 
Verder zou je nog de grote method kunnen opdelen in kleine methods, dit help met het 'lezen' van de code en geeft mits je een goede naam verzint ook weer uitleg.

bv een method zoals dit:
Code:
private static DoubleLinkedList InitializeNodeArray(DoubleLinkedList[] nodeArray, int[] initialArray)
{
	DoubleLinkedList before = nodeArray[0];
	
	if (initialArray[1] >= initialArray[0])
	{
		//infront
		nodeArray[0]._next = nodeArray[1];
		nodeArray[1]._previous = nodeArray[0];
	}
	else
	{
		//behind
		nodeArray[0]._previous = nodeArray[1];
		nodeArray[1]._next = nodeArray[0];
		before = nodeArray[1];
	}

	return before;
}

Dan dus te gebruiken zoals dit:
Code:
DoubleLinkedList before = InitializeNodeArray(nodeArray, arrayParameter);

(zelf ervaar ik het altijd fijn als je een method in z'n geheel kunt bekijken van begin '{' tot eind '}' op je scherm )


Maar als het alvast werkt, is het goed ;) (refactor OCD :D)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan