Задание. Написать программу создания двусвязного замкнутого списка (указатель
на следующий элемент в последнем узле списка должен указывать на первый
элемент, а указатель на предыдущий элемент списка первого узла имеет
указывать на последний созданный элемент). Удаление узлов списка
организовать по следующему правилу: удаляют каждый второй элемент
список до тех пор, пока это возможно будет выполнять (в результате список
Код:
состоять только из одного элемента).
#define _CRT_SECURE_NO_WARNINGS
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <stdio.h>
using namespace std;
struct node {
int inf;
node *lt;
node *rt;
};
void main()
{
node *fr, *en, *r, *v;
int nz, np, nv;
FILE *f;
fr = en = NULL;
f = fopen("t.dat", "r");
fscanf(f, "%d", &nz);
while (!feof(f))
{
r = new node; // Выделяет память под новый элемент узла.
r->inf = nz; // В поле inf нового узла засылаем число nz.
r->rt = NULL;
if (fr == NULL) // Если список пустой, то формируем список из одного элемента.
{
r->lt = NULL;
fr = r; // В указатель fr засылаем адрес первого элемента.
}
else
{
r->lt = en; // К новому элементу присоединяем список.
en->rt = r; // К списку присоединяем новый элемент.
}
en = r;
fscanf(f, "%d", &nz);
}
cout << "Список выдается слева направо:\n";
r = fr;
while (r != NULL)
{
cout << r->inf << " ";
r = r->rt; // Переход к следующему правому элементу списка.
}
cout << "\n\n";
cout << "Список выдается справа налево:\n";
r = en;
while (r != NULL)
{
cout << r->inf << " ";
r = r->lt; // Переход к следующему левому элементу списка.
}
cin.get();
cin.get();
cout << "\n Вставь звено с номером n = ";
cin >> nv;
cout << "За номером k = ";
cin >> np;
r = fr;
while ((r->inf != np) && (r != NULL))
r = r->rt; // Поиск элемента, за которым надо вставить новый узел.
if (r->inf != np)
{
cout << "Элемент с номером " << np << " НЕ НАЙДЕН \n";
}
else
{
v = new node;
v->inf = nv;
v->rt = r->rt;
v->lt = r;
if (r != en)
r->rt->lt = v;
else
en = v;
r->rt = v;
}
cout << "Список выдается слева направо:\n";
r = fr;
while (r != NULL)
{
cout << r->inf << " ";
r = r->rt;
}
cout << "\n\n";
cout << "Список выдается справа налево:\n";
r = en;
while (r != NULL)
{
cout << r->inf << " ";
r = r->lt;
}
cin.get();
cin.get();
cout << "\n\nУдали элемент с номером n = ";
cin >> np;
r = fr;
while ((r->inf != np) && (r != NULL))
r = r->rt; // Поиск элемента, который надо удалить.
if (r->inf != np)
{
cout << "Элемент с номером " << np << " НЕ НАЙДЕН \n";
}
else
{
if (r != en && r != fr) // Если удаляемый элемент находится между двумя узлами списка.
{
r->lt->rt = r->rt;
r->rt->lt = r->lt;
}
else
{
if (r == en) // Если удаляемый элемент последний.
{
en = r->lt;
en->rt = NULL;
}
if (r == fr) // Если удаляемый элемент первый.
{
fr = fr->rt;
fr->lt = NULL;
}
}
delete r;
}
cout << "Список выдается слева направо:\n";
r = fr;
while (r != NULL)
{
cout << r->inf << " ";
r = r->rt;
}
cout << "\n\n";
cout << "Список выдается справа налево:\n";
r = en;
while (r != NULL)
{
cout << r->inf << " ";
r = r->lt;
}
cin.get();
cin.get();
cout << "\nВведи номер головного элемента: ";
cin >> nv;
v = new node;
v->inf = nv;
fr->lt = v;
v->rt = fr;
v->lt = NULL;
fr = v;
cout << "Список выдается слева направо:\n";
r = fr;
while (r != NULL)
{
cout << r->inf << " ";
r = r->rt;
}
cout << "\n\n";
cout << "Список выдается справа налево:\n";
r = en;
while (r != NULL)
{
cout << r->inf << " ";
r = r->lt;
}
cin.get();
cin.get();
}