Przechodzenie po liście.

0

Witam!

Mam problem z listą cykliczną dwukierunkową. Do jej stworzenia wykorzystałem wartownika. Mam też wskaźnik na bieżący element listy. Zależy mi na tym aby ten wskaźnik przeskakiwał na kolejne elementy listy, albo do przodu albo do tyłu. Niestety nie udaje mi się tego zrobić. Oto kod:

Struktura

typedef struct Element {
	int liczba;
	struct Element *poprz;
	struct Element *nast;
}element;

Funkcja dodająca( tutaj też nie wiem czy to jest dobrze):

void dodaj(element *biezacy,int rejestr)
{

   element *nowy=(element *)malloc(sizeof(element));
   if(biezacy == NULL) //czy pusta
   {
	nowy->liczba = rejestr;
    nowy->nast = nowy ;
    nowy->poprz = nowy;
    biezacy = nowy;
	}
	else
	{
   nowy->liczba = rejestr;
   nowy->nast=biezacy->nast;
   nowy->poprz=biezacy;
   nowy->nast->poprz=nowy;
   biezacy->nast=nowy;
	}
}

I tutaj funkcja, ktora ma przeskakiwac na kolejne elementy listy:

void przesun(element *biezacy,int liczba) {
	int i;
	biezacy=biezacy->nast;
	for(i=0;i<liczba;i++)
		biezacy=biezacy->nast;


}

Co do funkcji dodawania, to nie wiem cz warunek na to czy jest pusta jest dobry. Oto doklaracja wartownika:

element *wartownik=(element*)malloc(sizeof(element));
		wartownik->nast=wartownik;
		wartownik->poprz=wartownik;
		element* biezacy = wartownik;
0

To jest jakiś bezsens. Twoja funkcja przesuwająca przesuwa wskaźnik który jest kopią argumentu wiec poza funkcją nie zobaczysz efektu.
Proponuje funkcję next która przesuwa sie o 1 pole, bo to jest sensowniejsze rozwiazanie i bardziej przydatne. Ale można sie obejść bez niej pisząc po prostu

wskaznik = wskaznik->next;

Niech ta funkcja przesuwająca zwraca wskaźnik na którym stanęła ;)

0

Ok, wywaliłem tą funkcje i zrobiłem w mainie i działa. Mam jeszcze pytanie do do dodawania kolejnych elementow listy. Przy wypisywaniu np. gdy dodam element 2 i 3 to wypisuje 2,3, 233232. Nie wiem czemu wychodzi po za zakres. Wydaje mi sie ze blad jest w dodawaniu elementu, gdy lista jest pusta...

0

Nie mam siły tego analizowac o tej godzinie, ale może on po prostu odczytuje też wartośc wartownika? ;]

0

Uporałem się z dodawaniem, teraz mam problem z wyświetlaniem xD. Mianowicie, na wejściu do programu dostaje polecenia, dodajace elementy, usuwające itd.

Jest też polecenie, ktore każe wyświetlić element na którym znajduje się wskaźnik bieżący. Problem polega na tym, ze te element nalezy wyświetlić po zakonczeniu wpisywania poleceń.

Gdy wyświetlam na bieżąco(czyli wpisuje polecenie wyswietl, program wyswietla i nastepnie pobiera kolejne polecenia) to nie ma problemu. Natomiast, gdy chce wyświetlic na końcu wszystko to wyświetla n-krotnie ta sama liczbe.

Oto kod funkcji wyświetlającej:

int wypisz(element *biezacy) {

	element *temp = biezacy;
	temp=temp->nast;
	return temp->liczba;
}

Tutaj kod, ktory zapisuje do tablicy poszczegolne liczby, ktore maja zostac wyswietlone:

prn[index]=wypisz(biezacy);
index++;

Na koncu jest petla, ktora jedzie po kazdym elemencie prn i go wyswietla(tutaj pojawia sie ta sama liczba n-krotnie, dokładnie jest to pierwszy z elementów listy).

Nie wiem gdzie tkwi błąd.

0

Ja chyba nie ogarniam. To ty chcesz wypisać wszystkie elementy, czy tylko ten na którym znajduje sie wskaźnik bieżący?
A że dzieje sie tak jak piszesz to oczywiste. Czemu? Bo znów zrobiłes dokładnie to samo co poprzednio, ale teraz to jeszcze bardziej harkorowo. Przecież wskaźnik biezacy W OGÓLE SIE NIE ZMIENIŁ! Logiczne że cały czas dostajesz tą samą liczbę...
Zauważ ze wewnątrz funkcji wskaźnik biezacy to jest jedynie KOPIA wskaźnika który przekazujesz jako argument. To ze go zmienisz wewnatrz funkcji wcale nie powoduje zmian na zewnątrz funkcji. Rozwiązaniem jest przekazanie adresu tego wskaźnika (czyli np. wypisz(&biezacy) a wewnatrz funkcji zrobienie czegoś takiego:

int wypisz(element** biezacy) 
{
  *biezacy = (*biezacy) -> nastepny /*ten twój temp był tu zupełnie zbędny*/
  return (*biezacy) -> liczba
}

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