LinkedList und Append Funktion

bRainLaG

Mitglied
So ich mach das mal komplett da ich den Fehler einfach nicht entdecke obwohl ich auch mit der Ausgabe einiges getestet habe:

Code:
public class LinkedList<T extends Number>  implements Iterator<T>, Serializable	{
	
	
	private class Node<T extends Number> {
		
		Node next;
		double value;
		
		Node(){
			
		}
		Node(double value, Node next){
			
			this.value = value;
			this.next = next;
		}
	}
	
	public Node<T> head = new Node<T>();
	
	public static void main(String[] args) {
		LinkedList l = new LinkedList();
		System.out.println("Start beginnt");
		l.append(5.34);
		System.out.println("Start zwei");
		l.append(6.76);
		l.append(7.74);
		l.append(8.32);
		System.out.println("Abbruch sollte geschehen");
		System.out.println(l);
		l.fold();
		System.out.print("oha");
	}
	
	
	void append (double value){
		Node<T> ptr = head;
		Node<T> pnext = ptr.next;
		
		
		if (ptr == null){
			ptr = new Node<T>(value, pnext);
		}
		for(;;){
			if(pnext != null){
				ptr = pnext;
			}
			else pnext = new Node<T>(value, pnext);
			break;
		}
	}
	
	void fold (){
		
		Node ptr = head;
		Node<T> next = ptr.next;
		
		double produkt = 1;
		for(;;){
		if (ptr != null) {
		  produkt *= ptr.value;
		  ptr = next;
		  System.out.println(produkt);
		}
		else System.out.println(produkt);
		break;
		}
	}

Ausgabe:

Start beginnt
Start zwei
Abbruch sollte geschehen
übungen1.LinkedList@72e3b895
0.0
oha
 
Zuletzt bearbeitet:
Der Fehler ist entweder, das die append Methode nicht richtig funktioniert, und keine Elemente in die Liste gepackt werden, oder das die fold Funktion nicht funktioniert, und keine Berechnung der Elemente funktioniert.

Selbst wenn ich mir mit System.out.println die Liste ausgeben lasse, kriege ich ja nur das Wirrwarr das mit übungen1... beginnt raus deswegen bin ich leicht verwirrt
 
Schreib doch mal bitte Kommentare in deinen Code um dir selber klar zu machen was du da eigentlich machen willst.

Mit entsprechenden Ausgaben kannst du gut prüfen was dein Programm tut um herauszufinden was nicht klappt.

Übrigens ein for(;;) ist sehr unschön. Entweder while(true) oder definiere eine ordentliche Bedingung.
 
Also das wirrwarr kommt daher das du die toString() Methode von Object in deiner Klasse nicht überschreibst. ( http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html#toString() ). Daher wird der Klassenname + HashCode der Instanz ausgegeben. Um das ein wenig sprechender zu machen musst du sowas in der Art in deiner Klasse hinzufügen:
Code:
@Override
	public String toString() {
		StringBuilder ret = new StringBuilder();
		Node<T> node = head;
		while(node != null) {
			ret.append(node.value);
			ret.append(", ");
			node = node.next;
		}
		return ret.toString();
	}
 
Zuletzt bearbeitet:
Und hier noch eine funktionierende Version deiner append Methode:
Code:
// darf nicht instanziiert werden. Da kommt sonst die 0.0 her
public Node<T> head;

void append (double value){
		// create first element
		if(head==null) {
			head = new Node<T>(value, null);
		} else {
			Node<T> ptr = head;

			// get last element
			while (ptr.next!=null) {
				ptr = ptr.next;
			}
			ptr.next = new Node<T>(value, null);
		}
	}
 
Und hier nochmal dein Gesamter Code etwas schöner:

Code:
package de.test;

import java.io.Serializable;
import java.util.Iterator;

public class LinkedList<T extends Number>  implements Iterable<T>, Serializable	{
	
	private static final long serialVersionUID = -6085537759194700648L;
	private Node<T> head;
	
	
	public static void main(String[] args) {
		LinkedList<Double> l = new LinkedList<Double>();
		System.out.println("Start beginnt");
		l.append(5.34);
		System.out.println("Start zwei");
		l.append(6.76);
		l.append(7.74);
		l.append(8.32);
		System.out.println("Abbruch sollte geschehen");
		System.out.println(l);
		l.fold();
		System.out.println("oha");
		
		LinkedList<Integer> l2 = new LinkedList<Integer>();
		l2.append(3);
		l2.append(5);
		System.out.println(l2);
		l2.fold();
	}
	
	
	void append (T value){
		// create first element
		if(head==null) {
			head = new Node<T>(value);
		} else {
			Node<T> ptr = head;

			// get last element
			while (ptr.next!=null) {
				ptr = ptr.next;
			}
			ptr.next = new Node<T>(value);
		}
	}
	
	void fold (){
		Node ptr = head;
		Double produkt = 1d;
		
		for(T num : this) {
		  produkt *= Double.parseDouble(num.toString());
		  ptr = ptr.next;
		  System.out.println(produkt);
		}
		System.out.println(produkt);
	}

	
	public Iterator<T> iterator() {
		return new LinkedListIterator();
	}


	@Override
	public String toString() {
		StringBuilder ret = new StringBuilder();
		ret.append('{');
		for(T num : this) {
			if(ret.length()>1) {
				ret.append(", ");
			}
			ret.append(num);			
		}
		ret.append('}');
		return ret.toString();
	}
	
	private static class Node<T extends Number> {
		
		Node<T> next;
		T value;
		
		Node(T value){
			this.value = value;
		}

		
	}
	
	private class LinkedListIterator implements Iterator<T> {

		Node<T> currentNode;
		
		private LinkedListIterator() {
			currentNode = head;
		}
		
		public boolean hasNext() {
			return currentNode!=null;
		}

		public T next() {
			T ret = currentNode.value;
			currentNode = currentNode.next;
			return ret;
		}

		public void remove() {
			throw new UnsupportedOperationException();
		}
	}
}


Und JA! mir ist langweilig ;-)
 
Zuletzt bearbeitet:
Ich fände es schöner wenn er selber lernen würde wie das geht. Dass du das kannst hilft ihm auch nicht weiter.
 
hmmm ich hätte vielmehr ne reine grundfrage bei deinem quellcode:

und zwar deine Node Class ist so weit sehr eingänglich aber muss bei einer LinkedList in der Node Class nicht einmal der Wert stehen und dann noch der Verweis auf den nächsten knoten?

Code:
Node(T value){
			this.value = value;
		}

also dort noch der Verweis auf das nächste Element rein.

@zeja du hast schon recht allerdings bringt es mir auch garnichts wenn ich den richtigen quellcode blind einbauen würde, denn dann kann ich es das nächste mal ja immernoch nicht. Ich will es ja lernen und deshalb werd ich mir das heute Abend mit meinem vergleichen und das nicht blind übernehmen denn dabei gewinne ich überhaupt nix.
 
Zurück