Надо переписать программу, она работает, но нужно, чтобы узлы из кольцевого списка удалялись не последовательно 1,2,3..., а удалялся каждый k-й элемент. Например, ввожу k=4, и выводится:
1->2->3->4->5->6->7->8->9->1
1->2->3->4->6->7->8->9->1
1->2->3->4->6->7->8->1
1->2->3->6->7->8->1
2->3->6->7->8->2
2->3->6->8->2
2->3->8->2
2->3->2
2->2
Отсчитывает от текущего k-раз и удаляет элемент, и так до конца
C++ |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
| #include <iostream>
#include <stdlib.h>
//СТРУКТУРА БУДЕТ ЭЛЕМЕНТОМ СПИСКА
using namespace std;
struct Node //или просто Звено списка
{
int x; //инфо данные структуры
Node *Next; //Указатель не следующее звено
};
//КЛАСС СПИСОК
class List
{
Node *Head,*Tail; //Указатели на начало списка и на конец
public:
List():Head(NULL),Tail(NULL){}; //Инициализация указателей как пустых
~List(); //Деструктор для освобождения памяти от всего что будет
void Add(int x); //Функция заполнения структуры Node и добавления её в список как элемента
void Show(); //Функция отображения списка List
void del(); //Функция изъятия элемента
};
List::~List() //ДЕСТРУКТОР ДЛЯ ОЧИСТКИ ПАМЯТИ
{
Node *temp=Head; //Временный указатель на начало списка
while (temp!=NULL) //Пока в списке что-то есть
{
temp=Head->Next; //Резерв адреса на следующий элемент списка
delete Head; //Освобождение памяти от первой структуры как элемента списка
Head=temp; //Сдвиг начала на следующий адрес, который берем из резерва
}
}
//ФУНКЦИЯ ЗАПОЛНЕНИЯ ИНФОРМАЦИОННЫХ ПОЛЕЙ СТРУКТУРЫ NODE И ДОБАВЛЕНИЯ ЭТОЙ СТРУКТУРЫ В СПИСОК
void List::Add(int x)
{
Node *temp=new Node; //Выделение памяти для нового звена списка
temp->x=x; //Временное запоминание принятого параметра x
temp->Next=NULL; //Указание, что следующее звено новосозданной структуры пока пустое
if (Head!=NULL) //Если список не пуст
{
Tail->Next=temp; //Указание, что следующее звено списка это новосозданная структура
Tail=temp;
} else Head=Tail=temp; //Если список не пуст, добавление первого элемента
}
//ФУНКЦИЯ ОТОБРАЖЕНИЯ СПИСКА НА ЭКРАНЕ
void List::Show()
{
Node *temp=Head; //Временный указатель на начало списка
while (temp!=NULL) //Пока в списке что-то встречается
{
cout<<temp->x<<" "; //Выводим значения из списка на экран
temp=temp->Next; //Сдвигаем указатель на начало на адрес следующего элемента
}
cout<<endl;
}
//ФУНКЦИЯ ИЗЪЯТИЯ ЭЛЕМЕНТА ИЗ ОЧЕРЕДИ
void List::del()
{
if (Head!=NULL) //Если список не пустой
{
Node *temp=Head; //Обращаемся к началу списка с помощью вспомогательного указателя
cout<<"ЭЛЕМЕНТ" <<Head->x<<" ВЫШЕЛ"<<endl;
Head=Head->Next; //Сдвиг начала списка
delete temp; //Освобождение памяти от предыдущего звена списка
}
}
int main()
{
setlocale(0,"");
List lst;
system("CLS");
lst.Add(100); //100
lst.Add(200); //100 200
lst.Add(300); //100 200 300
lst.Show(); // =100 200 300
lst.del(); // =200 300 (100 Первым вошел, Первым ушел)
cout<<endl; //просто чтоб лучше видно было
lst.Add(111); //200 300 111
lst.Add(222); //200 300 111 222
lst.Show(); // = 200 300 111 222
lst.Add(999); //200 300 111 222 999
lst.del(); // = 300 111 222 999 (200 Вторым пришел, вторым ушел)
lst.del(); // = 111 222 999
cout<<endl; //просто чтоб лучше видно было
lst.Show(); // = 111 222 999
system("PAUSE");
} |
|