Napisz funkcje kasująca n elementów za podanym x.

0

Cześć! Mam napisać funkcję kasującą n elementów za podanym x. Niestety mam problem jak się za to zabrać. Wiem jak to zrobić na przypadku usuwania jednego elementu za podanym x. Bardzo proszę o pomoc!

0

Co to rekrutacja do przedszkola? ale z czego chcesz kasować te elementy?

0
Szalony Programista2 napisał(a):

Co to rekrutacja do przedszkola? ale z czego chcesz kasować te elementy?

z listy jednokierunkowej

0

Czy podano x jako wartość czy x jako węzeł?

2

Musisz podać kod, bo każdy może na swój sposób zaimplementować listę.

0
void Delete_N(node*&H, int n, int x){
            if(H){
            node*p =H;
            while( p->next->val != x ) p = p->next;
            for(int i = 0; i < n; i++){
            p->next = e->next;
            delete e;
        }
    }
}
0

Jak robisz listę musisz trzymać wskaźnik do head i tail, czyli do początku listy i końca.
I dobrze też trzymać next do następnego i parent do poprzedniego.

p[0]->next wskazuje na p[1], p[0]->next->next wskazuje na p[2], to jak chcesz usunąć element p[1] to robisz p[0]->next = p[2], p[2]->parent = p[0], free/delete na p[1], i jeśli p[2]-> next == null to head = p[1]

z twojego skrawka kodu wynika, że usuwasz wszystkie elementy? Dziwnie to napisane jest.
Ale dziwnie to napisane, jeśli while loop iteruje pointer dopóki nie trafi na wartość, to musisz sprawdzić czy istnieje następna jak nie to jesteś na samej górze listy, ta pętla for wydaje się nie potrzebna, bo tylko następny ustawiasz jako poprzedni, a środkowy usuwasz.

Czyli rozwiązanie powinno być jakieś takie:
p->parent->next = p->next;
p->next->parent = p->parent;
No i jeśli head lub tail się zmienił to też trzeba poprawić.
if p->parent->next-> == null;
head = p->parent->next;
delete p;

0
Szalony Programista2 napisał(a):

Jak robisz listę musisz trzymać wskaźnik do head i tail, czyli do początku listy i końca.
I dobrze też trzymać next do następnego i parent do poprzedniego.

p[0]->next wskazuje na p[1], p[0]->next->next wskazuje na p[2], to jak chcesz usunąć element p[1] to robisz p[0]->next = p[2], p[2]->parent = p[0], free/delete na p[1], i jeśli p[2]-> next == null to head = p[1]

z twojego skrawka kodu wynika, że usuwasz wszystkie elementy? Dziwnie to napisane jest.
Ale dziwnie to napisane, jeśli while loop iteruje pointer dopóki nie trafi na wartość, to musisz sprawdzić czy istnieje następna jak nie to jesteś na samej górze listy, ta pętla for wydaje się nie potrzebna, bo tylko następny ustawiasz jako poprzedni, a środkowy usuwasz.

Czyli rozwiązanie powinno być jakieś takie:
p->parent->next = p->next;
p->next->parent = p->parent;
No i jeśli head lub tail się zmienił to też trzeba poprawić.
if p->parent->next-> == null;
head = p->parent->next;
delete p;

ok bardzo dziękuję za wytłumaczenie błędów :)

1

Podziel to na:

node *find(node *head,int val) { ... }
void remove_n(node *&head,int n) { ... }

void remove_n_after_value(node *head,int val,int n)
{
	node *drop=find(head,val);
	if(drop) remove_n(drop->next,n);
}

node *find(node *head,int val)
{
	while((head)&&(head->val!=val)) head=head->next;
	return head;
}

void remove_n(node *&head,int n)
{
	while((head)&&(n-->0))
	{
		node *drop=head->next;
		head=tmp->next;
		delete drop;
	}
}

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