Удаление циклического связанного списка С++, отсчет начинается со следующего узла

Я понятия не имею, как удалить в списке циклических ссылок. Например, голова была B, поэтому список будет идти от «B, C, D, E, A». Первый узел всегда будет выбирать число от 1 до 5, которое я продолжаю уменьшать с помощью счетчика, поэтому, например, если «B» выбрал 3, счет начнется со следующего узла, который является «C», поэтому считаю от «C», нам придется устранить «Е», как только «Е» будет устранено.

Новая голова, также известная как сборщик, начнет со следующего узла после исключенного узла, поэтому следующий набор узлов станет «A, B, C, D», эта функция должна повторяться до тех пор, пока не останется только 1 последний постоянный узел.

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include <string>
#include <ctime>

using namespace std;

/*
* Node Declaration
*/
struct node
{
    string name;
    struct node *next;
};

node *t, *head;
node *ex;
int paper;
int ctr = 5;
int num;

void create(string sname)
{
    node *n = new node;
    n->name = sname;
    if (head == NULL)
    {
        head = n;
        t = n;
    }
    else
    {
        t->next = n; // connects the nodes
        t = t->next; // moves the connecter to the t= last
    }
    t->next = head;
}


/*
* Deletion of element from the list
*/
void delete_element(string value)
{
}

//Display Circular Link List

void display()
{
    node *temp = new node;
    temp = head;

    if ((head == NULL) && (t == NULL))
    {
    }

    for (int j = 1; j <= 5; j++)
    {
        cout << temp->name << "\n";
        temp = temp->next;
    }
}

void firstpic()
{
    srand(time(NULL));
    paper = rand() % 5 + 1;
    int fctr = 5;
    bool p1 = 0, p2 = 0, p3 = 0, p4 = 0, p5 = 0;

    if (paper == 1)
    {
        create("A");//1
        fctr--;
    }
    else if (paper == 2)
    {
        create("B");//2
        p2 = 1;
    }
    else if (paper == 3)
    {
        create("C");//2
        p3 = 1;
    }
    else if (paper == 4)
    {
        create("D");//2
        p4 = 1;
    }
    else if (paper == 5)
    {
        create("E");//2
        p5 = 1;
    }

    if (p1) 
    {
        create("B");
        create("C");
        create("D");
        create("E");
    }
    else if (p2) 
    {
        create("C");
        create("D");
        create("E");
        create("A");
    }
    else if (p3) 
    {
        create("D");
        create("E");
        create("A");
        create("B");
    }
    else if (p4) 
    {
        create("E");
        create("A");
        create("B");
        create("D");
    }
    else if (p5) 
    {
        create("A");
        create("B");
        create("C");
        create("D");
    }
}

void drawn()
{
    node *holder = head;
    ex = holder->next;
    cout << holder->name << " has drawn: " <<num <<endl;
}

int main()
{
    head == NULL;
    t == NULL;
    srand(time(NULL));
    firstpic();
    display();
    num = rand() % ctr + 1;
    drawn();

    system("pause>nul");
    return 0;
}

person Ivan Apungan    schedule 27.07.2017    source источник
comment
Найдите узел перед тем, который вы хотите удалить, nodePrev, и узел после узла, который вы хотите удалить, nodeNext, а затем просто соедините их: nodePrev->next = nodeNext. Вам нужно будет убедиться, что вы сбросили свой корень или head, если вы его удалили. Также обычно помогает сделать эти связанные списки двунаправленными.   -  person jakedipity    schedule 27.07.2017
comment
Например, если моя голова (D), а список выглядит так (D, E, A, B, C), то мой хвост (C), верно? затем D нарисовал 5, поэтому, начиная с (E) до (D), (D) будет удален. такой синтаксис: Void delpos(int pos) { node *prev; узел *следующий; предыдущий = глава; // заголовок заметки = D for(int x =0; x‹ pos+1; x++) // плюс 1, потому что он должен начать отсчет // до следующего узла { prev = prev-›next; } следующий = предыдущий-›следующий; } это правильно?   -  person Ivan Apungan    schedule 27.07.2017


Ответы (1)


Вот что может удовлетворить ваши потребности:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <ctime>

using namespace std;

/*
* Node Declaration
*/
struct node
{
    string name;
    struct node *next;
};

node *tail, *head;

void addNode(string sname)
{
    node *n = new node;
    n->name = sname;

    if (head == NULL) {
        head = n;
        tail = n;
    } else {
        tail->next = n;    // connects the nodes
        tail = tail->next; // moves the connecter to the t= last
    }
    tail->next = head;
}


/*
* Deletion of element from the list
*/
void removeNode(string value)
{
    // no elements
    if (head == NULL) {
        return;
    }

    node *n = head;
    node *prev = tail;

    // 1 element
    if(n == prev) {
        if(n->name == value) {
            delete n;
            head = tail = NULL;
        }
        return;
    }

    bool found = false;
    // search
    do {
        if(n->name == value) {
            found = true;
            break;
        }
        prev = n;
        n = n->next;
    } while (n != head);

    // no such element
    if(!found) {
        return;
    }

    prev->next = n->next;
    if(n == head) {
        head = n->next;
    } else if(n == tail) {
        tail = prev;
    }
    delete n;
}

void displayList()
{
    if (head == NULL) {
        cout << "empty!" << endl;
        return;
    }

    node *n = head;

    do {
        cout << n->name << "\n";
        n = n->next;
    } while (n != head);
    cout << endl;
}

void createList()
{
    const int count = 5;
    std::string names[count] = {"A", "B", "C", "D", "E"};

    int nameIndex = rand() % count;

    for(int i = 0; i<count; ++i) {
        nameIndex += 1;
        nameIndex %= count;
        addNode(names[nameIndex]);
    }
}

int main()
{
    srand(time(NULL));

    head = NULL;
    tail = NULL;

    createList();
    displayList();
    removeNode("A");
    displayList();
    removeNode("A");
    displayList();
    removeNode("E");
    displayList();
    removeNode("B");
    displayList();
    removeNode("C");
    displayList();
    removeNode("D");
    displayList();

    system("pause>nul");

    return 0;
}

Обратите внимание, что при удалении узла вы должны позаботиться о таких случаях, как:

  • Дело без элементов
  • Последний 1 элемент для удаления
  • Удаление головы
  • Удаление хвоста

Кроме того, никогда не делайте то, что вы делали в своей функции firstpic(): это болезненный способ сделать это. Функция drawn(), кажется, не делает ничего, что имеет смысл, но это выходит за рамки вопроса.

person Nikolai Shalakin    schedule 27.07.2017
comment
боже мой, вы просто находка, я изучу эти коды, большое спасибо, я очень ценю это ‹3 благослови вас бог, спасибо. - person Ivan Apungan; 27.07.2017