Knoten in C# programmieren



  • Also ich bin jetzt ganz neu in C# und ich würde gern mal wissen wie folgender C++ Quellcode in C# aussehen würde 😕

    #include <stdlib.h>
    
    struct Knoten
    {
        struct Knoten *Next;
        int Value;
    };
    
    int main()
    {
        struct Knoten AlleKnoten[100];
        struct Knoten *Knoten1;
    
        Knoten1        = &AlleKnoten[0];
        Knoten1->Next  = &AlleKnoten[1];
        Knoten1->Value = 10;
    
        Knoten1        = Knoten1->Next;
        Knoten1->Next  = NULL;
        Knoten1->Value = 20;
    
        return 0;
    }
    

    Danke schon mal 🙂



  • using System;
    
    namespace ConsoleApplication3
    {
    
    	class Class1
    	{
    		[STAThread]
    		static void Main(string[] args)
    		{
    			Knoten root = new Knoten();
    			root.wert = 0;
    			for(int i=0;i<5;i++)
    			{
    				Knoten note = new Knoten();
    				note.wert = i+1;
    				NewKnoten(root,note);
    			}
    
    			ShowKnoten(root);
    
    			Console.ReadLine();
    		}
    
    		// fügt rekursiv Knoten immer hinten an
    		static private void NewKnoten(Knoten root, Knoten newKnoten)
    		{
    			if(root.naechster == null)
    			{
    				root.naechster = newKnoten;
    				return;
    			}
    			else
    			{
    				NewKnoten(root.naechster,newKnoten);
    			}
    		}
    
    		// zeigt alle Knoten an rekursiv
    		static private void ShowKnoten(Knoten root)
    		{
    			if(root.naechster != null)
    			{
    				Console.WriteLine(root.wert);
    				ShowKnoten(root.naechster);
    			}
    			else
    			{
    				Console.WriteLine(root.wert);
    				return;
    			}
    		}
    	}
    
    	class Knoten
    	{
    		public Knoten()
    		{
    			naechster = null;
    		}
    
    		public int wert;
    		public Knoten naechster;
    	}
    
    }
    

    Bäume kann man auch pflanzen ähmm machen.
    Das Beispiel zeigt deutlich das man in C# mit Referenztypen zu tun hat.

    Ich sage aber gleich da der eine Member naechster ja public ist
    ist er nicht gegen unbefugten Gebrauch geschützt.
    Das kann man dann so lösen indem man die Verwaltungsarbeit der Liste auch den Knoten überlässt.

    using System;
    
    namespace ConsoleApplication3
    {
    
    	class Class1
    	{
    		[STAThread]
    		static void Main(string[] args)
    		{
    			Knoten root = new Knoten(0);
    
    			for(int i=0;i<5;i++)
    			{
    				Knoten note = new Knoten(i+1);
    				Knoten.Add(root,note);
    			}
    
    			Knoten.ShowAllKnoten(root);
    
    			Console.ReadLine();
    
    			Knoten.ClearAll(ref root);
    
    			Knoten.ShowAllKnoten(root);
                      Knoten.Add(root, new Knoten(1));
    
    			Console.ReadLine();
    
    		}
    
    	}
    
    	class Knoten
    	{
    		public Knoten(int wert)
    		{
    			naechster = null;
    			this.wert = wert;
    		}
    
    		private int wert;
    		private Knoten naechster;
    
    		public static void Add(Knoten root, Knoten newKnoten)
    		{
    			if(root == null)
    			{
    				Console.WriteLine("An eine leere Liste kann nichts angehangen werden");
    				return;
    			}
    
    			if(root.naechster == null)
    			{
    				root.naechster = newKnoten;
    				return;
    			}
    			else
    			{
    				Add(root.naechster, newKnoten);
    			}
    
    		}
    
    		public static void ShowAllKnoten(Knoten root)
    		{
    
    			if(root == null)
    			{
    				Console.WriteLine("Leere Liste kann nicht angezeigt werden");
    				return;
    			}
    
    			if(root.naechster == null)
    			{
    				Console.WriteLine(root.wert);
    				return;
    			}
    			else
    			{
    				Console.WriteLine(root.wert);
    				ShowAllKnoten(root.naechster);
    			}
    		}
    
    		public static void ClearAll(ref Knoten root)
    		{
    			Knoten temp = root;
    			while(root.naechster != null)
    			{
    				Clear(ref root);
    				root = temp;
    			}
    			Console.WriteLine("delete " + root.wert.ToString());
    			root = null;
    		}
    
    		private static void Clear(ref Knoten knoten)
    		{
    			if(knoten.naechster != null)
    				Clear(ref knoten.naechster);
    			else
    			{
    				Console.WriteLine("delete " + knoten.wert.ToString());
    				knoten = null;
    				return;
    			}
    		}
    
    	}
    
    }
    

    Die Beispiele sollten aussagekräftig genug sein.
    Dazu wäre aber zu sagen das es schon optimierte Container in C# gibt.

    Stichwort Namensraum System.Collections unter darunter noch folgende Namensräume (System.Collections.Specialized) hoffentlich habe ich mich jetzt nicht verschrieben. Man sollte diese Container ruhig benutzen!
    Das ist ein gut gemeinter Ratschlag. Such mal in der MSDN nach Collection oder
    ArrayList, StringCollection und dergleichen.

    Gruss sclearscreen

    p.S.: hier noch ein Link auf der Seite kannst mal nach "Tree" suchen

    Ich habe über diesen Suchschlüssel mal folgende Links dort genommen
    http://www.codeproject.com/vb/net/SimpleBTree.asp
    http://www.codeproject.com/csharp/persistentdatastructures.asp



  • Wow... ich bin Dir echt dankbar für deine Antwort 😮

    so eine gute Antwort auf Fragen findet man echt selten!!!

    👍 👍 👍 👍 👍



  • ja, man muss wirklich sagen, dass sclearscreen eine bereicherung des forums ist. seine antworten sind immer spitze und verweisen nicht einfach auf die suchfunktion oder google.

    👍 👍 👍


Anmelden zum Antworten