Usuwanie elementu z kolejki

0

Mając kod kolejki
http://www.algorytm.org/klasyczne/kolejka/kolejka-1-cs.html
Jak usunąć element kolejki o danym parametrze? Np. mając kolejkę 2,4,6,8,10,12 chciałbym usunąć elementy 2,8,12 by w efekcie otrzymać kolejkę 4,6,10.

2

A czy przypadkiem głównym założeniem kolejki (LIFO lub FIFO) jest to aby zdejmować elementy w określonej kolejności? W tym przypadku ta zasada zostaje zaburzona.

1

Musisz przeiterować po elementach kolejki i znaleźć ten który spełnia warunek. Jeśli go znajdziesz na pozycji n: elementowi n - 1 w polu next przypisujesz referencję do elementu n + 1.
Sytuacje szczególne to kiedy szukany element jest pierwszym lub ostatnim - wtedy trzeba pokombinować z polem first lub last w klasie kolejki.

2

To, co chcesz zrobić nazywa się listą. W C# zaimplementowane jako LinkedList. Kolejki nie mają takich funkcjonalności.

0

Gdyby ktoś potrzebował metodę usuwającą element z kolejki to tutaj kod.
Oczywiście nie jest idealny, ale każdy sobie może go dopieścić.

public void deleteElem(string x)
        {
            bool a = true;
         
            if (first !=null)
            {
                if (first.next==null)
                {
                    if (first.value==x)
                    {
                        first = null;
                    }
                }
                else
                {
                    Node nodeOne = first;

                    Node nodeNext = first.next;

                    Node nodeLast = null;

                    while (a)
                    {
                        if (nodeOne.value==x)
                        {
                            if (nodeOne==first)
                            {
                                first = nodeNext;
                            }
                            else
                            {
                                nodeLast.next = nodeNext;
                            }
                            nodeLast = nodeOne;
                            nodeOne = nodeNext;
                            if (nodeNext==null)
                            {
                                last = nodeLast;
                                break;
                            }
                            nodeNext = nodeNext.next;
                        }
                        else
                        {
                            if (nodeNext==null)
                            {
                                last = nodeLast;
                                break;
                            }
                            nodeLast = nodeOne;
                            nodeOne = nodeNext;
                            nodeNext = nodeNext.next;
                        }
                    }
                }
            }
            else
            {
                Console.WriteLine("queue is empty");
                //a = false;
            }
        }
0

Działa to? Testowałeś?

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