Я понятия не имею, как удалить в списке циклических ссылок. Например, голова была 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;
}
nodePrev, и узел после узла, который вы хотите удалить,nodeNext, а затем просто соедините их:nodePrev->next = nodeNext. Вам нужно будет убедиться, что вы сбросили свой корень илиhead, если вы его удалили. Также обычно помогает сделать эти связанные списки двунаправленными. - person jakedipity   schedule 27.07.2017