Lista 1 kierunkowa mały problem

0

Witam mam problem w tym programie (poniżej), napisałem dodawanie, usuwanie, wyświetlanie ktoś mi pomógł ale nie mogę zrobić dodawania elementu na daną pozycje wskazaną przez użytkownika jak to zrobić??

#include <iostream>

using namespace std;

struct Element{
int liczba;
Element* back;
Element* next;
};

void dodaj(int liczba, Element *&glowka);
void wyswietl(Element *&glowka);
void usun(Element *&glowka);
void wstaw (int liczba, Element *&glowka);

int main(){

Element *glowa = new Element;
glowa = NULL;

dodaj(14, glowa);
dodaj(25, glowa);
dodaj(36, glowa);
dodaj(46, glowa);
wyswietl(glowa);
usun(glowa);
wyswietl(glowa);
wstaw(glowa);
return 0;
}

void dodaj(int liczba, Element *&glowka){
Element *tmp = new Element();

tmp->liczba = liczba;
tmp->next = NULL;
tmp->back = NULL;

//jeĹĽeli lista jest pusta..
if(glowka == NULL) glowka = tmp;
else{
Element *t = glowka;
while(t->next) t = t->next;
t->next = tmp;
tmp->back = t;
}

}

void wyswietl(Element *&glowka){
unsigned int i=1;
Element *tmp = glowka;
Element *tmp2 = glowka;

while(glowka != NULL){
cout<<"Element "<<i<<":"<<endl;
i+=1;
cout<<"Liczba: "<<glowka->liczba<<endl;
cout<<"Addr: "<<glowka<<endl;
cout<<"Next: "<<glowka->next<<endl;
cout<<"Back: "<<glowka->back<<endl<<endl<<endl;
glowka = glowka->next;
}
cout<<endl<<endl<<endl;
glowka = tmp;
while(glowka != NULL){
cout<<glowka->liczba<<"->";
glowka = glowka->next;
}
cout<<"NULL"<<endl<<endl;
glowka = tmp2;
}

void usun(Element *&glowka){

if (glowka != NULL){
Element *t = glowka;
while(t->next) t = t->next;
//cout<<t->liczba<<endl;
t->back->next = NULL;
delete t;
}

void wstaw(int liczba, Element *&glowka){
Element *tmp = new Element();

}

}

0

To bardzo źle ktoś ci pomógł, tu błąd na błędzie siedzi i błędem pogania.

0

To znaczy wiesz program działa tylko że bez wstawiania i robi to co trzeba, a o to chodzi. :D Wiesz jak zrobić to wstawianie elementu na dana pozycję przez użytkownika ?? :D

0
 Element *glowa = new Element;
 glowa = NULL; 

WTF? Przydzielasz pamięć i zamazujesz do niej wskaźnik.

 void usun(Element *&glowka){
...
  delete t;
}

WTF? Masz głowę na karku? To się zastanów tylko jeden delete nie zależnie od tego ile jest elementów na tej liście?

void wyswietl(Element *&glowka){

WTF? Wyświetlenie może zmieniać początek listy?

 Element *tmp = glowka;
 Element *tmp2 = glowka;

WTF? Po kiego ci dwie zmienne?

 if(glowka == NULL) glowka = tmp;
 else{
  Element *t = glowka;
  while(t->next) t = t->next;
  t->next = tmp;
  tmp->back = t;
 }

WTF? Jak potrzebujesz dodawać na koniec to dorób jeszcze wskaźnik Element *ogonek. Bo tak psujesz jedyną zaletę listy - czas dodawania O(1).

0

No może i trochę zryty ten program ale najważniejsze że działa:D mi potrzebne jest coś takiego żeby dodawało element w miejscu które sobie sam wybiorę np na pozycji 3 :D i on wtedy dodaje na pozycje 3 nowy element a tamte pozycje przesuwa o +1:D

0

Dobra jak masz pisać bezsensowne posty i nie dawać konkretnych rad to zostaw te komentarze dla sb a nie je piszesz, kogo to obchodzi ??

0

@_13th_Dragon stara Ci sie pomoc, a Ty co?
Najlepiej by bylo jakbys zrobil tak jak On Ci radzi. Ale skoro nie chcesz to powiedz mi.
Czemu w nazwie tematu piszesz o liscie jedno kierunkowej, a w kodzie tworzysz liste dwukierunkowa(next, back)? Napisales rowniez, ze funkcje dodawania zrobiles sam, wiec z funkcja dodawania w podanym przez uzytkownika miejscu tez nie powinienes miec zadnego problemu. Moze powiesz w ktorym miejscu polegles, albo co probowales zrobic? Jezeli juz chodzi o liste jedno kierunkowa to wystarczy ze bedziesz sie trzymal tego:

  1. Znajdziesz miejsce w ktorym chcesz dodac nowy element.
  2. Zapiszesz w jakiejs zmiennej pomocniczej adres na jaki wskazuje ten element.
  3. Stworzysz nowy element i przypiszesz w miejsce pobranego przez Ciebie adresu adres stworzenego elementu.
  4. Pozniej do zmiennej next w stworzonym przez Cb elemencie przypiszesz to na co wskazuje zmienna pomocnicza(czyli adres nastepnego elementu)
    Troche Cie nakieruje:
void/*bool (co wolisz)*/ func(Element* head, int liczba, int miejsce) {
....
	Element* tmp;

	tmp = head->next;
	head->next = new Element;

	head = head->next;
	head->liczba = liczba;
	head->next = tmp;
...
}

Dostosuj to do swojego kodu i dodaj wyszukiwanie, mi sie nie chce :)

0

Sorki 2 kierunkowa :D a coś takiego by przypasiło, bo mi coś jednak nie działa...

wstaw(int liczba, int miejsce, Element *glowa){ 
if(miejsce != 0){ 
glowa = glowa->next; 
wstaw(liczba, miejsce-1, glowa); 
} 
else{ 
Element *temp = new Element; 

nowy->next = glowka; 
        nowy->back = glowka->back; 

        glowka->back->next = nowy; 
        glowka->back = nowy; 
}
}
0

Na moim kodzie pokaze Ci jak powinno to wygladac.
Skoro jest dwukierunkowa to musisz jeszcze zmienic to na co wskazuje nastepny element w back. Czyli:

void/*bool (co wolisz)*/ func(Element* head, int liczba, int miejsce) {
....
        Element* tmp, tmp2;
 
        tmp = head->next;
        tmp2 = head;

        head->next = new Element;
        head = head->next;
        head->back = tmp2;
        head->liczba = liczba;
        head->next = tmp;
        head = head->next;
        tmp2 = head;
        head->back = tmp2;
...
}

Zeby zobrazowac:
Wyszukujesz element i zmieniasz next na adres nowego elementu, potem przesuwasz sie do nowego elementu i musisz przypisac adresy poprzedniego (do back) i nastepnego elementu(do next), ponownie przesuwasz sie do nastepnego elementu i zmieniasz tam adres na jaki wskazuje wskaznik back.

Teraz jezeli chodzi o twoj kod(nie analizuje tego wczesniejszego tylko funkcje, ktora dodaje we wskazanym miejscu element):

  1. W argumentach funkcji masz wskaznik o nazwie glowa, w polowie kodu uzywasz go w drugiej polowie(powiedzmy) juz uzywasz glowka. Nie mam pojecia jak chcesz zeby to dzialalo.
  2. Czym jest zmienna nowy i gdzie zostala ona przez Cb zadeklarowana?
  3. Dlaczego wykonujesz ta funkcje rekurencyjnie kiedy miejsce jest rozne od zera?
  4. Wyszukiwanie mozesz zrobic za pomoca petli np. while, zaczynajac od pierwszego elementu i konczac na zadanym miejscu.
  5. Powinienes rowniez pomyslec jak co trzeba zrobic kiedy ktos bedzie chcial zmienic pierwszy lub ostatni element.

No powiedzmy ze na razie tyle. Ale nadal uwazam ze powinienes ten kod albo poprawic, albo napisac od nowa.

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