Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> добавление, удаление элементов в дерево, добавление, удаление элементов в дерево 
V
    Опции темы
unkname
Дата 14.6.2014, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 14.6.2014

Репутация: нет
Всего: нет



Сформировать массив записей, описывающих следующую таблицу:Фамилия, Адрес, N телефона. Удалить из массива тех абонентов,  телефон которых  начинается с цифры 3. Скорректированный массив вывести в прежней форме.
Решил реализовать следующим образом древовидную структуру сделал двухуровневой – номер телефона и список абонентов, к которым относится  номер. Проблема с корректным удаление абонентов, прошу помочь, кто знает как это сделать.

Код

#include "stdafx.h"
#include "iostream"
#include "conio.h"
#include "string.h"
using namespace std;

struct Abonent 
{
    char fio[40];
    char address[40];
    int phone;
};

struct TreeNode
{
    int phone;
    Abonent abonenty;
    TreeNode *next;
    TreeNode *child;
};

class n_abonent 
{
    private: 
    TreeNode *head; 
    public: 
    n_abonent()
    {
        head = new TreeNode;
        TreeNode *node1 = new TreeNode;
        node1->phone = 1;
        node1->child = NULL;
        node1->next = NULL;
        head->child = node1;
        TreeNode *node2 = new TreeNode;
        node2->phone = 2;
        node2->child = NULL;
        node2->next = NULL;
        node1->next = node2;
        TreeNode *node3 = new TreeNode;
        node3->phone = 3;
        node3->child = NULL;
        node3->next = NULL;
        node2->next = node3;
        Abonent a = {"Zorina.A.A","ul.Juzhnaja d.1 kv-1",243543};
        TreeNode *nodeA = new TreeNode;
        nodeA->abonenty = a;
        nodeA->child = NULL;
        nodeA->next = NULL;
        node3->child = nodeA;
        TreeNode *nodeB = new TreeNode;
        Abonent b = {"Petrov.I.S","ul.Juzhnaja d.2 kv-2",143565};
        nodeB->abonenty = b;
        nodeB->child = NULL;
        nodeB->next = NULL;
        node2->child = nodeB;
        TreeNode *nodeC = new TreeNode;
        Abonent c = {"Ivanov.V.E","ul.Juzhnaja d.3 kv-3",335412};
        nodeC->abonenty = c;
        nodeC->child = NULL;
        nodeC->next = NULL;
        node1->child = nodeC;
    }

    void add_node(int i) 
    {
    Abonent a; 

    char c;
    cout << endl << "Vvedite abonenta " << i+1 << " \n";
    cout << "        fio: ";
    cin.getline(a.fio, 40);

    cout << "    address: ";
    cin.getline(a.address, 40);

    cout << "      phone: ";
    cin >> a.phone;
    cin.get(c);

    TreeNode *node = head->child;
        while(true)
        {
            if(node->phone == a.phone)
            {
                TreeNode *newNode = new TreeNode;
                newNode->abonenty = a;
                newNode->child = NULL;
                newNode->next = NULL;
                if(node->child == NULL)
                    node->child = newNode;
                else    
                {
                    TreeNode *elem = node->child;
                    while(elem->next != NULL)
                        elem = elem->next;
                    elem->next = newNode;
                }

                return;
            }
            if(node->next == NULL)
                break;
            node = node->next;
        }
        TreeNode *newNode = new TreeNode;
        newNode->phone = a.phone;
        newNode->child = NULL;
        newNode->next = NULL;
        node->next = newNode;
        TreeNode *nodeA = new TreeNode;
        nodeA->abonenty = a;
        nodeA->child = NULL;
        nodeA->next = NULL;
        newNode->child = nodeA;

    }

    void print_node () 
{
        printf("----------------------------------------------------------------\n");
        printf("|%20s|%20s|%20s|\n","fio","address","phone");
        printf("----------------------------------------------------------------\n");
        TreeNode *node = head->child;
        while(node != NULL)
        {
            if(node->child != NULL)
            {
                TreeNode *child = node->child;
                while(child != NULL)
                {
        printf("|%20s|%20s|%20d|\n",  child->abonenty.fio,child->abonenty.address,child->abonenty.phone);
                child = child->next;
                }
            }
            node = node->next;
            }
        printf("----------------------------------------------------------------\n");
}

int first(int k)
{
    int res=0;
    while(k>0)
    {
        res=k%10;
        k/=10;
    }
    return res;
}

    void DelNode()
    {
        printf("----------------------------------------------------------------\n");
        printf("|%20s|%20s|%20s|\n","fio","address","phone");
        printf("----------------------------------------------------------------\n");
        TreeNode *node = head->child;
        while(node != NULL)
        {
            if(first(node->abonenty.phone)==3)
            {
                if(node->child == node)
                    node->child = NULL;
                else    
                {
                    ....
                }
                TreeNode *child = node->child;
                while(node->child != NULL)
                delete(node->child,node);
                delete node;

            printf("|%20s|%20s|%20d|\n",  child->abonenty.fio,child->abonenty.address,child->abonenty.phone);
            child = child->next;
            node = node->next;
            }
        }
        printf("----------------------------------------------------------------\n");
    }
};

int main()
{    
    n_abonent n_a;
    for (int i = 3; i < 5; i++)
    {
        n_a.add_node(i);
    }
    n_a.print_node();
    n_a.DelNode();
    _getch();
    return 0;
}

PM MAIL   Вверх
feodorv
Дата 15.6.2014, 02:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(unkname @  14.6.2014,  11:34 Найти цитируемый пост)
Решил реализовать следующим образом древовидную структуру сделал двухуровневой – номер телефона и список абонентов, к которым относится  номер.

Зачем? По постановке задачи такое не требуется.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
unkname
Дата 15.6.2014, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 14.6.2014

Репутация: нет
Всего: нет



Цитата(feodorv @ 15.6.2014,  02:33)
Цитата(unkname @  14.6.2014,  11:34 Найти цитируемый пост)
Решил реализовать следующим образом древовидную структуру сделал двухуровневой – номер телефона и список абонентов, к которым относится  номер.

Зачем? По постановке задачи такое не требуется.

тогда подскажите, как можно реализовать? 
PM MAIL   Вверх
feodorv
Дата 15.6.2014, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(unkname @  15.6.2014,  10:34 Найти цитируемый пост)
тогда подскажите, как можно реализовать?  

Я думаю, где-то так:
Код

struct Abonent 
{
    char fio[40];
    char address[40];
    char phone[20];
};

void enterAbonent( Abonent& abonent );
printAbonents( Abonent *abonents, int count);
deleteAbonents( Abonent &abonents, int &count);
...

int count;
cout << "Введите число записей" << endl;
cin >> count;

Abonent *abonents = new Abonent[count];
for( int i = 0; i < count; i++) enterAbonent( abonents[i] );
printAbonents( abonents, count);

abonents = deleteAbonents( abonents, count);
printAbonents( abonents, count);


А deleteAbonents типа этого:
Код

Abonent *deleteAbonents( Abonent *abonents, int &count)
{
  int remove = 0;

  for( int i = 0; i < count; i++) 
    if( abonents[i].phone[0] == '3' ) remove++;
  if( remove == 0 ) return abonents;
  
  Abonent *list = new Abonent[count-remove];
  int listCount = 0;

  for( int i = 0; i < count; i++) 
    if( abonents[i].phone[0] != '3' )
      list[listCount++] = abonents[i];

  delete abonents;
  count = listCount;
  return list;
}

Это если очень не хочется memcpy/memmove...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
unkname
Дата 15.6.2014, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 14.6.2014

Репутация: нет
Всего: нет



Цитата(feodorv @ 15.6.2014,  15:12)
Цитата(unkname @  15.6.2014,  10:34 Найти цитируемый пост)
тогда подскажите, как можно реализовать?  

Я думаю, где-то так:
Код

struct Abonent 
{
    char fio[40];
    char address[40];
    char phone[20];
};

void enterAbonent( Abonent& abonent );
printAbonents( Abonent *abonents, int count);
deleteAbonents( Abonent &abonents, int &count);
...

int count;
cout << "Введите число записей" << endl;
cin >> count;

Abonent *abonents = new Abonent[count];
for( int i = 0; i < count; i++) enterAbonent( abonents[i] );
printAbonents( abonents, count);

abonents = deleteAbonents( abonents, count);
printAbonents( abonents, count);


А deleteAbonents типа этого:
Код

Abonent *deleteAbonents( Abonent *abonents, int &count)
{
  int remove = 0;

  for( int i = 0; i < count; i++) 
    if( abonents[i].phone[0] == '3' ) remove++;
  if( remove == 0 ) return abonents;
  
  Abonent *list = new Abonent[count-remove];
  int listCount = 0;

  for( int i = 0; i < count; i++) 
    if( abonents[i].phone[0] != '3' )
      list[listCount++] = abonents[i];

  delete abonents;
  count = listCount;
  return list;
}

Это если очень не хочется memcpy/memmove...

нужно именно дерево 
PM MAIL   Вверх
feodorv
Дата 15.6.2014, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(unkname @  15.6.2014,  16:23 Найти цитируемый пост)
нужно именно дерево  

Вижу противоречие:
Цитата(unkname @  14.6.2014,  11:34 Найти цитируемый пост)
Сформировать массив записей




--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0788 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.