• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Przechowywanie współrzędnych punktów na liście dwukierunkowej

Object Storage Arubacloud
0 głosów
156 wizyt
pytanie zadane 22 czerwca 2020 w C# przez Mariusz M Obywatel (1,640 p.)

Napisałem sobie generyczną listę dwukierunkową

implementująca interfejs IComparable wzorując się na przykładowej liście dwukierunkowej

z książki Roberta Lafore Algorytmy i struktury danych w Javie

oraz na kilku wątkach znalezionych na anglojęzycznych forach

Klasa węzła

// Link

using System;

namespace DoublyLinkedList
{
	public class Link<T> : IComparable<Link<T>> where T : IComparable<T>
	{
		public T Data { get; set; }
		public Link<T> Next { get; set; }
		public Link<T> Previous { get; set; }
		public Link() { Next = null; Previous = null; }
		public Link(T d) { Data = d; Next = null; Previous = null; }
		public void DisplayLink()
		{ Console.Write(Data.ToString() + " "); }
		public int CompareTo(Link<T> other) { return Data.CompareTo(other.Data); }
		public int CompareTo(T other) { return Data.CompareTo(other); }
	}
}

 

Klasa listy

//DoublyLinkedList

using System;

namespace DoublyLinkedList
{
	public class DoublyLinkedList<T> where T : IComparable<T>
	{
		public Link<T> First { get; set; }
		public Link<T> Last { get; set; }
		public DoublyLinkedList(){ First = null;Last = null; }
		public bool IsEmpty()
		{ return First == null; }
		public Link<T> Find(T key)
		{
			if (IsEmpty()) return null;
			Link<T> current = First;
			while(current.CompareTo(key) != 0)
			{
				if (current.Next == null)
					return null;
				else
					current = current.Next;
			}
			return current;
		}
		public void InsertFirst(T dd)
		{
			Link<T> newLink = new Link<T>(dd);
			if (IsEmpty())
				Last = newLink;
			else
				First.Previous = newLink;
			newLink.Next = First;
			First = newLink;
		}
		public void InsertLast(T dd)
		{
			Link<T> newLink = new Link<T>(dd);
			if (IsEmpty())
				First = newLink;
			else
			{
				Last.Next = newLink;
				newLink.Previous = Last;
			}
			Last = newLink;
		}
		public Link<T> DeleteFirst()
		{
			if (IsEmpty()) return null;
			Link<T> temp = First;
			if (First.Next == null)
				Last = null;
			else
				First.Next.Previous = null;
			First = First.Next;
			return temp;
		}
		public Link<T> DeleteLast()
		{
			if (IsEmpty()) return null;
			Link<T> temp = Last;
			if (First.Next == null)
				First = null;
			else
				Last.Previous.Next = null;
			Last = Last.Previous;
			return temp;
		}
		public bool InsertAfter(T key, T dd)
		{
			Link<T> current = Find(key);
			if (current == null) return false;
			Link<T> newLink = new Link<T>(dd);
			if(current == Last)
			{
				newLink.Next = null;
				Last = newLink;
			}
			else
			{
				newLink.Next = current.Next;
				current.Next.Previous = newLink;
			}
			newLink.Previous = current;
			current.Next = newLink;
			return true;
		}
		public void Insert(T key)
		{
			Link<T> newLink = new Link<T>(key);
			Link<T> previous = null;
			Link<T> current = First;
			while(current != null && current.CompareTo(key) < 0)
			{
				previous = current;
				current = current.Next;
			}
			if (previous == null)
				First = newLink;
			else
				previous.Next = newLink;
			newLink.Next = current;
			//Poprawka dla listy dwukierunkowej
			if (current == null)
				Last = newLink;
			else
				current.Previous = newLink;
			newLink.Previous = previous;
		}
		public Link<T> DeleteKey(T key)
		{
			Link<T> current = Find(key);
			if (current == null) return null;
			if (current == First)
				First = current.Next;
			else
				current.Previous.Next = current.Next;
			if (current == Last)
				Last = current.Previous;
			else
				current.Next.Previous = current.Previous;
			return current;
		}
		public void DisplayForward()
		{
			Console.Write("List (first-->last): ");
			Link<T> current = First;
			while(current != null)
			{
				current.DisplayLink();
				current = current.Next;
			}
			Console.WriteLine();
		}
		public void DisplayBackward()
		{
			Console.Write("List (last-->first): ");
			Link<T> current = Last;
			while (current != null)
			{
				current.DisplayLink();
				current = current.Previous;
			}
			Console.WriteLine();
		}
	}
}

 

Teraz chciałbym przechowywać współrzędne punktów płaszczyzny na tej liście tylko

nie bardzo wiem jak to zrealizować
Jestem początkujący jeśli chodzi o C#

 

2 odpowiedzi

0 głosów
odpowiedź 22 czerwca 2020 przez draghan VIP (106,230 p.)

Jeśli dobrze zrozumiałem, chcesz po prostu utworzyć instancję klasy DoublyLinkedList z parametrem T=Point, gdzie Point byłby klasą opisującą właście punkt na płaszczyźnie.

Jeśli nie masz swojej klasy opisującej punkt, to C# udostępnia taką klasę.

Teraz zostało tylko to ubrać w kod:

using System.Windows;
// ...
DoublyLinkedList<Point> ListOfPoints;

 

komentarz 22 czerwca 2020 przez Mariusz M Obywatel (1,640 p.)
Zauważ że w funkcjach takich jak
znajdź węzeł,wstaw węzeł za węzłem o danym kluczu ,usuń węzeł o danym kluczu
wstaw węzeł (do listy uporządkowanej) korzystam z funkcji CompareTo()
i chodziło mi o to czy można by napisać tę funkcję dla klasy Point ,
która porównywałaby najpierw współrzędne odcięte
a w przypadku równych współrzędnych odciętych porównywałaby współrzędne rzędne
komentarz 23 czerwca 2020 przez draghan VIP (106,230 p.)

Jeśli klasa System.Windows.Point nie spełnia Twoich wymagań (nie posiada metody CompareTo() lub posiada taką której definicja Tobie nie odpowiada), masz kilka wyjść.

Po pierwsze, możesz napisać własną klasę, która będzie spełniała Twoje wymagania. To jest spoko opcja, jeśli chcesz sobie poćwiczyć definiowanie klas narzędziowych.

Po drugie, możesz napisać klasę która będzie rozszerzała System.Windows.Point o potrzebne Tobie metody, wykorzystując mechanizm dziedziczenia, o ile dana klasa nie jest opatrzona klauzulą final.

Po trzecie, możesz wykorzystać ciekawy mechanizm C#, żeby dorzucić brakujące Tobie metody bezpośrednio do tej klasy bez jej dziedziczenia - napisać metodę rozszerzającą (ang. extension method).

komentarz 23 czerwca 2020 przez draghan VIP (106,230 p.)

Mały update: jeśli chciałbyś skorzystać z System.Windows.Point, to niestety odpada Ci opcja numer 2, którą zaproponowałem wyżej, ponieważ System.Windows.Point jest strukturą a nie klasą; C# nie pozwala na dziedziczenie ze struktur.

komentarz 27 czerwca 2020 przez Mariusz M Obywatel (1,640 p.)
Przejrzałem wątki na stack overflow i znalazłem rozwiązanie
Mógłbyś zajrzeć do wątku
https://forum.pasja-informatyki.pl/471121/otoczka-wypukla-monotone-chain
Nie mam pomysłu na zapisanie tego algorytmu z użyciem tej listy
Algorytm Jarvisa było jakoś łatwiej zapisać z wykorzystaniem listy
0 głosów
odpowiedź 26 czerwca 2020 przez Mariusz M Obywatel (1,640 p.)
edycja 26 czerwca 2020 przez Mariusz M
using System;
namespace DoublyLinkedList
{
    public class Point : IComparable
    {
        public int X { get; set; }
        public int Y { get; set; }
        public Point(int x=0,int y=0)
        {
           X = x;
           Y = y;
        }
        public override string ToString()
        {
            return "(" + X.ToString() + "," + Y.ToString() + ")";
        }
        public int CompareTo(Point p)
        {
            int t = 1;
            if ((X < p.X) || ((X == p.X) && (Y < p.Y)))
                t = -1;
            if ((X == p.X) && (Y == p.Y))
                t = 0;
            return t;
        }
        public int CompareTo(object obj)
        {
            return CompareTo((Point)obj)
        }
    }
}



No i teraz oczekują zaimplementowania metody

public int CompareTo(object obj)

a ja potrzebuje tej metody co napisałem wyżej 

a poza tym gdy użyję tej klasy Point jako typu dla listy dwukierunkowej 

to dostaję błąd CS0311

 

Jeśli chodzi o metodę porównującą to chyba sobie poradziłem ale zostaje ten błąd CS0311

Już znalazłem rozwiązanie  przeglądając  istniejące wątki na stack overflow (nie zakładałem u nich wątku)

choć zastanawia mnie jedna rzecz
 

Podobne pytania

0 głosów
1 odpowiedź 158 wizyt
pytanie zadane 27 grudnia 2016 w C i C++ przez Doli Nowicjusz (200 p.)
0 głosów
0 odpowiedzi 163 wizyt
pytanie zadane 9 maja 2016 w C i C++ przez VDI Początkujący (260 p.)

92,571 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...