Permalänk
Medlem

Sortera länkade listor [C#]

Får inte sorteringen att fungera med länkade listor.
Vet att det är enklare med vektorer men tänker inte använda det

I varje Nod tänkte jag spara: 'Namn' , 'Epost' och 'Övrigt' och sen sortera efter namn osv.

Några tips på hur jag ska gå tillväga?

Visa signatur

000111011

Permalänk

Skulle kunna tänka mig att det är enkelt att sortera med en bubblesort, där du istället för att byta plats i en array ställer om pekarna. Jag kan bara göra det i java, så någon exempelkod kan jag nog inte ge dig.

Visa signatur

System.out.print(madness ? this.is.SPARTA : "");

Permalänk
Medlem

Det är bubblesort jag ska använda mig av (dock inte ett måste). Vet att det är bara själva adresserna på Noderna jag ska sortera. Men när jag kör sorteringen så verkar den tappa adresserna till noderna.

Visa signatur

000111011

Permalänk
Avstängd

Posta lite kod?

Permalänk
Avstängd

Implementera en klass med interfacet IComparable, som tar hand om jämförelserna för din struktur/klass, så kan du sen använda ArrayList:ens quicksort. Lättare och snyggare. Posta lite kod så kan vi nog implentera det åt dig om du får problem.

Permalänk
Medlem

Postar det jag har att jobba med för tillfället...
Det är kanske inte det snyggaste men iaf

EDIT: Klippte bort lite delar. Problemet är alltså att jag ska hämta in data från en txt fil, spara datat i länkade listor och sortera listan efter namn.

using System; using TeamProg; //Från skolan (MyInput) using System.IO; class Person { public string namn; public string personnummer; public string telefon; } class PersonNod { public Person p; public PersonNod nästa; } class Telefonbok { static PersonNod rot = null; public static void Main(string[] args) { HämtaFil(); Meny(); } public static void Meny() { // Switch-Case meny bortklippt } public static void SkapaPost() { PersonNod nod = new PersonNod(); Person temp = new Person(); Console.WriteLine("\nMata in uppgifter för personen\n"); temp.namn = MyInput.GetString("Namn:"); temp.personnummer = MyInput.GetString("Personnummer:"); temp.telefon = MyInput.GetString("Telefon:"); nod.p = temp; nod.nästa = rot; rot = nod; } public static void SortNamn() { // Här ska sorteringen vara } public static void SkrivUtPoster() { PersonNod temp = rot; while (temp != null) { Console.WriteLine("Namn:" +temp.p.namn); Console.WriteLine("Telefon:" +temp.p.telefon); Console.WriteLine("Personnummer:" +temp.p.personnummer); Console.Write("\n"); temp = temp.nästa; } Console.ReadLine(); } public static void Slut() { SparaFil(); } public static void HämtaFil() { //Hämtar från txt fil } public static void SparaFil() { // Sparar till en txt fil } }

Visa signatur

000111011

Permalänk
Avstängd

Fan kan du posta så lite kod som möjligt (där felet finns - typ ta bort filhantering, meny, etc), och kan du indentera allting rätt?

Permalänk
Hedersmedlem

Är inte klassen PersonNod ganska onödigt? En person är ju en nod i listan. Jag hade placerat "public Person nästa;" i Person-klassen istället och på så sätt sluppit PersonNod. Sen vad gäller sortering så bör du göra som Cure säger.

Permalänk
Medlem

Förlorar jag inte själva länkningen om jag slänger in allt i en arraylist ?

Så här?
Från txt -> länkade listan -> arraylist -> Sortera -> länkade listan - Till txt

Enligt läraren så skulle man köra med både PersonNod och person.
För att det skulle tydligen bli enklare att sortera. Man behöver ju bara sortera själva adresserna.

Visa signatur

000111011

Permalänk
Avstängd

Jösses, så det ser ut! Din SkapaPost är helt åt skogen. Du ska aldrig ha text i en konstruktor. Skriv nånting i stil med:

PS. Denna kod är helt fel och kommer inte att kompilera. Detta är första gången i mitt liv jag ser C# kod, det var därför jag bad dig posta lite kod, för jag ville se hur det språket ser ut. Mycket snack om det språket är det ju, så nyfiken är man...

main ()
{
Console.WriteLine("\nMata in uppgifter för personen\n");
namn = MyInput.GetString("Namn:");
pnr = MyInput.GetString("Personnummer:");
tel = MyInput.GetString("Telefon:");

PersonNod minPerson = SkapaPost (namn, pnr, tel);
minPerson.SkrivUtPost (); // skriv ut info om denna person
mintelefonlista.SkrivUtPoster (); // skriv ut all info
}

PersonNod::SkrivUtPost ()
{
cout << namn << pnr << tel;
}

TelefonLista::SkrivUtPoster ()
{
for (PersonNod p = 0; p < antalPoster; p++) // fixa denna rad, den är fel
SkrivUtPost (p)
}

public static void SkapaPost(string namn, pnr, tel)
{
Person temp = new Person (namn, pnr, tel);
p = temp;
nästa = rot; // här måste du sätta pekarna till nästa nod rätt.
rot = nästa // lätt att det blir fel, kontrollera dessa rader
}

eller nåt sånt... Som sagt, detta är första gången jag ser C# kod, så denna kommer inte kompilera. Du får fixa till ganska mycket...