Lista jednokierunkowa prawie skończona

0

import java.util.;
import java.io.
;
public interface Lista {

class ElementL{ // klasa wewnętrzna - element listy
	int dane;
	ElementL nastepny;
	
	public ElementL(int x, ElementL n)
	{
		dane=x;
		nastepny=n;
	}
	
	public ElementL getNext(){
		return nastepny;
		}
	
	public int getWartosc(){
		return dane;
		}
	}

public class list{
	ElementL  start;
	list(){
		start=null;
		}
	
	public ElementL getStart(){
		return start;
		}
	
	// dodaje element i na początek listy
	public void insert(int i){
		ElementL temp = new ElementL(i,start);
		start=temp;
	}
	// ładuje zawartość pliku do listy
	public int read(String fileName) throws FileNotFoundException
	{
		FileReader plik = null;
		plik = new FileReader(fileName);
		int i=0;
		String w;
		BufferedReader bfr = new BufferedReader(plik);
		try{
		
		while ((w = bfr.readLine()) != null)
		{
			insert(Integer.parseInt(w));
			i++;
		}}
		 catch (IOException e) {
			 
			 System.out.println("Błąd odczytu z pliku");
		 }
		return i;
	}
	//wypisuje kolejne elementy listy na ekranie
	public void write()
	{
		if(start!=null){
			ElementL temp = start;
			while(temp!=null){
			System.out.print(temp.getWartosc() + " ");
			temp=temp.getNext();
			}
			System.out.println();  
			} else {
			System.out.println("Stos jest pusty");
			}
	}
	// zwraca true, jeśli x znajduje się w liście
	public boolean contains(int x){
		boolean  z= false;
		if(start!=null){
			ElementL temp = start;
			while(temp!=null){
			if (x == temp.getWartosc()) z=true;
			temp=temp.getNext();
			}  
			}
		
		return z;
	}
	//zwraca pozycję pierwszego wystąpienia x w liście, lub -1
	public int find(int x)
	{
		boolean z=false;
		int indeks=1;
		if(start!=null){
			ElementL temp = start;
			while(temp!=null && z!=true){
			if (x == temp.getWartosc()) z=true;
			temp=temp.getNext();
			}  
			}
		else indeks=indeks+1;
		if (z==true) return indeks;
		else return -1;
	}
	
	// zwraca wartość pierwszego elementu listy
	public int getFirst() //throws Exception
	{
		
		if (start!=null) 
			return start.getWartosc();
		else return -1;
	
	}
	// zwraca wartość i-tego elementu listy
	public int get(int i) //throws Exception
	{
		boolean z=false;
		int indeks=1;
		int g=0;
		if(start!=null){
			ElementL temp = start;
			while(temp!=null && z!=true){
			if (i == indeks) 
				{
				z=true;
				g=temp.getWartosc();
				}
			else
			{
			indeks=indeks+1;
			temp=temp.getNext();
			}
			}  
			}
		
		if (z==true) return g;
		else return -1;
	}
	
	// usuwa pierwszy element, zwraca jego wartość
	public int removeFirst() //throws Exception
	{
		
		if(start!=null){
			start = start.getNext();
			} else {
			System.out.println("Lista jest pusta");
			} 
		return start.getWartosc();
	}
	
	// usuwa i-ty element z listy, zwraca jego wartość
	public int remove(int i) //throws Exception
	{
		boolean z=false;
		int indeks=1;
		int g=0;
		if(start!=null){
			ElementL temp = start;
			while(temp!=null && z!=true){
			if (i == indeks) 
				{
				z=true;
				g=temp.getWartosc();
				start = start.getNext();
				}
			else
			{
			indeks=indeks+1;
			temp=temp.getNext();
			}
			}  
			}
		
		if (z==true) return g;
		else return -1;
	}
	
	public static void main(String[] args) throws FileNotFoundException
	{
		list q = new list();
		PrintWriter zapis = new PrintWriter("zadania.txt");
		System.out.println("Podaj kilka liczb, zero kończy wprowadzanie");
		int x=5;
		while (x!=0)
		{
			Scanner wp = new Scanner(System.in);
			x=wp.nextInt();
			if (x!=0) zapis.println(x);
		}
		zapis.close();
		q.read("zadania.txt");
		q.write();
		if(q.contains(5) == true) System.out.println("Zawiera");
		q.removeFirst();
		q.remove(6);
		q.write();
	}
}

}

Mam mały błąd w usuwaniu i-tego elementu listy może ktoś wie dlaczego??? I może ktoś pomoże z wyjątkami, starczy tylko jeden zrobić resztę sam zrobię.

0

nie kasuje mi i-ty element tylko pierwszy pewnie coś z tą linijką start=start.getNext();

0

temp = temp.getNext();

0

nie kasuje nic jak zamienię

0

nikt nie potrafi tego rozwalić??? wyjątki sam już zrobie

0

import java.util.*;
import java.io.*;
public interface Lista {
       
        class ElementL{ // klasa wewnętrzna - element listy
                int dane;
                ElementL nastepny;
               
                public ElementL(int x, ElementL n)
                {
                        dane=x;
                        nastepny=n;
                }
               
                public ElementL getNext(){
                        return nastepny;
                        }
               
                public int getWartosc(){
                        return dane;
                        }
                }
       
        public class list{
                ElementL  start;
                list(){
                        start=null;
                        }
               
                public ElementL getStart(){
                        return start;
                        }
               
                // dodaje element i na początek listy
                public void insert(int i){
                        ElementL temp = new ElementL(i,start);
                        start=temp;
                }
                // ładuje zawartość pliku do listy
                public int read(String fileName) throws FileNotFoundException
                {
                        FileReader plik = null;
                        plik = new FileReader(fileName);
                        int i=0;
                        String w;
                        BufferedReader bfr = new BufferedReader(plik);
                        try{
                       
                        while ((w = bfr.readLine()) != null)
                        {
                                insert(Integer.parseInt(w));
                                i++;
                        }}
                         catch (IOException e) {
                                 
                                 System.out.println("Błąd odczytu z pliku");
                         }
                        return i;
                }
                //wypisuje kolejne elementy listy na ekranie
                public void write()
                {
                        if(start!=null){
                                ElementL temp = start;
                                while(temp!=null){
                                System.out.print(temp.getWartosc() + " ");
                                temp=temp.getNext();
                                }
                                System.out.println();  
                                } else {
                                System.out.println("Stos jest pusty");
                                }
                }
                // zwraca true, jeśli x znajduje się w liście
                public boolean contains(int x){
                        boolean  z= false;
                        if(start!=null){
                                ElementL temp = start;
                                while(temp!=null){
                                if (x == temp.getWartosc()) z=true;
                                temp=temp.getNext();
                                }  
                                }
                       
                        return z;
                }
                //zwraca pozycję pierwszego wystąpienia x w liście, lub -1
                public int find(int x)
                {
                        boolean z=false;
                        int indeks=1;
                        if(start!=null){
                                ElementL temp = start;
                                while(temp!=null && z!=true){
                                if (x == temp.getWartosc()) z=true;
                                else
                                        {indeks=indeks+1;
                                temp=temp.getNext();
                                        }
                                }  
                                }
                       
                        if (z==true) return indeks;
                        else return -1;
                }
               
                // zwraca wartość pierwszego elementu listy
                public int getFirst() //throws Exception
                {
                       
                        if (start!=null)
                                return start.getWartosc();
                        else return -1;
               
                }
                // zwraca wartość i-tego elementu listy
                public int get(int i) //throws Exception
                {
                        boolean z=false;
                        int indeks=1;
                        int g=0;
                        if(start!=null){
                                ElementL temp = start;
                                while(temp!=null && z!=true){
                                if (i == indeks)
                                        {
                                        z=true;
                                        g=temp.getWartosc();
                                        }
                                else
                                {
                                indeks=indeks+1;
                                temp=temp.getNext();
                                }
                                }  
                                }
                       
                        if (z==true) return g;
                        else return -1;
                }
               
                // usuwa pierwszy element, zwraca jego wartość
                public int removeFirst() //throws Exception
                {
                       
                        if(start!=null){
                                start = start.getNext();
                                } else {
                                System.out.println("Lista jest pusta");
                                }
                        return start.getWartosc();
                }
               
                // usuwa i-ty element z listy, zwraca jego wartość
                public int remove(int i) //throws Exception
                {
                        boolean z=false;
                        int indeks=1;
                        int g=0;
                        if(start!=null){
                                ElementL temp = start;
                                while(temp!=null && z!=true){
                                if (i == indeks)
                                        {
                                        z=true;
                                        g=temp.getWartosc();
                                        temp = temp.getNext();
                                        }
                                else
                                {
                                indeks=indeks+1;
                                temp=temp.getNext();
                                }
                                }  
                                }
                        if (z==true) return g;
                        else return -1;
                }
               
                public static void main(String[] args) throws FileNotFoundException
                {
                        list q = new list();
                        PrintWriter zapis = new PrintWriter("zadania.txt");
                        System.out.println("Podaj kilka liczb, zero kończy wprowadzanie");
                        int x=5;
                        while (x!=0)
                        {
                                Scanner wp = new Scanner(System.in);
                                x=wp.nextInt();
                                if (x!=0) zapis.println(x);
                        }
                        zapis.close();
                        q.read("zadania.txt");
                        q.write();
                        if(q.contains(5) == true) System.out.println("Zawiera");
                        q.removeFirst();
                        q.remove(6);
                        q.write();
                        q.insert(1);
                        q.write();
                        System.out.println(q.find(5));
                        System.out.println(q.get(3));
                }
        }
}
0
if (i == indeks)
                                        {
                                        z=true;
                                        g=temp.getWartosc();
                                        temp = temp.getNext(); // tutaj jest coś źle co nie wpisze tu ma usuwać
                                        }
0

Błędy:

  1. Wczytana lista ma elementy w kolejności odwrotnej niż podane.
  2. Metoda contains przegląda całą listę nawet jak już znalazła właściwy element. Zmienna "z" nic nie mówi, a poza tym jest zbędna. W get przynajmniej sprawdzasz czy już znalazłeś w warunku pętli. Najlepiej jednak po znalezieniu użyć w warunku znalezienia instrukcji break, która zakończy pętlę, kiedy jest już ona zbędna.
  3. Metoda removeFirst usuwa pierwszy element, ale podaje wartość drugiego, który stał się pierwszym.
  4. Metoda remove również przegląda całą listę mimo znalezienia właściwego elementu; Instrukcja temp = temp.getNext() jest do d**y podobnie jak wcześniejsze start = start.getNext(). Wcześniej przynajmniej modyfikowałeś listę, teraz nie modyfikujesz nic bo temp nie jest nigdzie przypisywane. Żeby móc to wykonać musisz pamiętać poprzedni element listy i to u niego modyfikować pole nastepny.

Zalecenia:

  1. Instrukcję indeks = indeks + 1 zamieniasz na indeks += 1, albo jeszcze lepiej na ++indeks.
  2. Żeby bawić się listami jest Ci potrzebna kartka papieru i ołówek (lub jakiś ekwiwalent), żebyś mógł sobie narysować węzły listy i organoleptycznie nauczyć się wstawiać kolejne elementy i je usuwać. Ewentualnie polecam pożyczyć jakąś kolejkę z wagonikami od maluchów, powsadzać tam cukierki, dodać figurkę kolejarza chodzącego od wagonu do wagonu i nauczyć się ręcznie wypinać wagony. ;) Przy takich operacjach zależnie od struktury listy (zwykła, dwukierunkowa, cykliczna) czasem łatwiej będzie usunąć węzeł sieci, a czasem przenieść dane z jednego węzła do drugiego i usunąć ten pierwszy. Musisz to opanować ręcznie, żeby móc to ogarnąć i napisać. Jeżeli chcesz to wszystko robić w pamięci i nie jesteś geniuszem (a prawie nikt nie jest), to zakopiesz się na kilka godzin bezowocnego kombinowania.
  3. ElementL powinien być klasą zagnieżdżoną w list (wewnętrzna, statyczna) po to aby klasa ta miała zapewniony dostęp do jej elementów lub metod. To, że nie masz problemu z dostępami zawdzięczasz tylko temu, że wszystko wpakowałeś do interfejsu, a jako nadmiar szczęścia pola nie są prywatne lecz private-package (czyli bez modyfikatorów). Sam interfejs Lista, to na obecnym etapie zbędny gadżet bo do niczego nie służy. Normalnie powinna zawierać same nagłówki metod publicznych umożliwiających operację na abstrakcyjnej liście. A przyda się dopiero wtedy kiedy będziesz miał tam więcej implementacji list niż tylko jedną.

1 użytkowników online, w tym zalogowanych: 0, gości: 1