Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.11.2014, 15:06   #1
Дана188
Пользователь
 
Регистрация: 14.10.2014
Сообщений: 21
По умолчанию Двусвязные списки, удалить каждый второй элемент С++

Задание. Написать программу создания двусвязного замкнутого списка (указатель
на следующий элемент в последнем узле списка должен указывать на первый
элемент, а указатель на предыдущий элемент списка первого узла имеет
указывать на последний созданный элемент). Удаление узлов списка
организовать по следующему правилу: удаляют каждый второй элемент
список до тех пор, пока это возможно будет выполнять (в результате список
Код:
состоять только из одного элемента).
#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();
}
Изображения
Тип файла: jpg 1.jpg (27.2 Кб, 141 просмотров)

Последний раз редактировалось ACE Valery; 18.11.2014 в 15:21.
Дана188 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двусвязные списки RedWhiteCasual Паскаль, Turbo Pascal, PascalABC.NET 0 06.02.2014 09:01
Двусвязные списки на Си Kastiel94 Помощь студентам 9 22.05.2013 21:20
Двусвязные списки vlados007 Общие вопросы C/C++ 5 13.02.2012 18:12
задан массив размером N. вывести на печать каждый второй элемент массива Сергей505 Паскаль, Turbo Pascal, PascalABC.NET 4 14.12.2011 17:37
Двусвязные списки aidar9012 Помощь студентам 6 28.06.2010 02:05