Pomysł na algorytm operujący na liście jednokierunkowej

0

Chcę zrobić następującą funkcje, ale nie mam pomysłu jak ją zrealizować. Ta procedura ma znajdować się w liście jednokierunkowej.

procedurę Wstaw wstawiającą do sznura podanego jako parametr element zawierający liczbę
podaną jako parametr tak, aby sznur był uporządkowany nierosnąco (zakładając, że sznur
wejściowy jest już uporządkowany w taki sposób);

Próbowałem porównać dane wejściowe, ze znajdującymi się juz danymi i jeśli dane wejściowe są większe lub równe znalezionej liczbie w liscie to program mial wstawić podana liczbe za znalezioną. Ale ten sposób nie bardzo działa.

0

pokaż kod. Zapewne problem polega na tym, że źle zapamiętujesz w jakim momencie iteracji jesteś i przez to nie wiesz jak wstawić nowy element.

0

Teraz wymyśliłem sposób, żeby policzyć "odległość" między dana liczbą, a każdą poszczególną liczbą znajdującą się w liście. Jeśli "odległość" jest najmniejsza to program za tą liczba wstawa daną.
odległość = dana_liczba - temp;

    void wstaw(int dane)
    {
        Element *p=new Element;
        p->liczba=dane;
        p->next=NULL;
        Element * za = new Element;
        int odleglosc, mini;
        mini = 0;
        if(head == NULL)
        {
            head = p;
            tail=head;
        }
        else
        {
            Element *temp = new Element;
            temp = head;
            while(temp!=NULL)
            {

               odleglosc=dane-temp->liczba;
                if(mini<odleglosc)
                {
                    za = temp;
                    mini=odleglosc;
                }



               temp=temp->next;
            }
            za->next=p;

        }

    } 

na razie wymyśliłem coś takiego, ale jak podam programowi wiecej niż jedną liczbe to mniejszą usuwa.

 
int main()
{

  sznur l1;
  l1.wstaw(5);
  l1.wstaw(6);
  l1.wstaw(7);
  l1.wyswietl();
}

W tym przypadku usuwa mi 6, a 7 wstawia poprawnie.

0

W tamtym sposobie problem leżał w tym, że program znalazł większą liczbę niż podana, ale nie uwzględniał tego, że dalej może znajdować sie jesszcze większa liczba.

1
void wstaw(int dane)
    {
        Element **p=&head;
        while (*p && (*p)->liczba>dane) {
            p = &((*p)->next);
        }
        Element *a=new Element;
        a->liczba = dane;
        a->next = *p;
        *p = a;
    } 
0

Dziękuję

A mógłby mi ktoś pomóc ogarnąć co tam się dzieje ? Bo tak "skompresowanej" wersji jeszcze nie widziałem :S

1

ale to jest bardzo proste. nic nie jest tu zagmatwane.
Podczas iteracji zamiast zapamiętywać sam adres elementu, zapamiętywany jest wskaźnik na wskaźnik do elementu. W ten sposób można zmodyfikować wskaźnik wskazujący na element przed którym chcesz coś wsadzić.
W pętli while *p sprawdza czy to jest już koniec listy (*p)->liczba>dane sprawdza czy nie jest spełniony warunek na "wsadź przed".
Po pętli w p masz wskaźnik na wskaźnik na element przed którym chcesz coś umieścić, więc potem możesz zmodyfikować wartość tego wskaźnika, bez ponownej iteracji przez całą listę.

0

A czemu takie coś nie działa ?

void wstaw( int dane )
{
    Element * temp = new Element;
    temp = head;
    while( temp && temp->liczba > dane )
    {
        temp = temp->next;
        
    }
    Element * a = new Element;
    a->liczba = dane;
    a->next = temp;
    temp = a;
} 

Dla mnie wygląda tak samo :)

0

Powiedziano mi, że modyfikuje kopie. Ale 'temp=head', wiec jak modyfikuje temp, to także modyfikuje head i resztę elementów. Prawda ?

0

No, ok. Zobacz zrobiłem sobie taki 'program', żeby przetestować to działanie na kopi i czy ona modyfikuje oryginał. W tym przypadku modyfikuje. Tutaj jak zrobilem "temp=temp2" i zmienilem temp2 to oryginał, czyli temp się też zmieniło. Czy ja coś źle rozkminiam to ?

 #include<iostream>
using namespace std;

int main()
{
	struct Element
	{
		int liczba;
		Element * next;
		Element()
		{
			liczba = 0;
			next = NULL;
			
			
		}
		
		
		
	};
	
Element * temp = new Element;
temp->liczba=10;
temp->next=new Element;
temp->next->liczba=15;
temp->next->next = new Element;
temp->next->next->liczba=20;
temp->next->next->next=NULL;

cout<<temp->liczba<<endl;
cout<<temp->next->liczba<<endl;	
cout<<temp->next->next->liczba<<endl;


Element *temp2 = new Element;
temp2=temp;
while(temp2)
{
	
	temp2->liczba = 10;
	temp2=temp2->next;
}
//cout<<"AAA";
while(temp)
{
	
	cout<<temp->liczba;
	temp=temp->next;
	
	
}
	
	
}

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