Форум программистов, компьютерный форум CyberForum.ru

Двусвязный список с объектом трех типов: "целое число", "вещественное число", "строка" - C++

Восстановить пароль Регистрация
 
egor2116
 Аватар для egor2116
337 / 368 / 42
Регистрация: 20.01.2013
Сообщений: 1,100
30.03.2013, 01:42     Двусвязный список с объектом трех типов: "целое число", "вещественное число", "строка" #1
Есть проблема. Реализовать двухсвязный список. Каждый элемент списка может содержать один объект. Объект может быть трех типов: "целое число", "вещественное число", "строка". В разных узлах одного списка может быть любой объект одного из допустимых типов.

Подскажите как подобное реализуется?

Сам список реализован только с одним из значений(в данном примере int data)
MyList.h
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
class MyList
{
private:
//    union data {
//        int whole;
//        double real;
//        string str;
//        };
 
    int count;
 
    struct node {
        int data;
        node * next;
        node * prev;
        node(int d,node * f,node * p) : data(d),next(f),prev(p) {}
        };
 
public :
    node * end;
    node * first;
public:
    void pushFirst(int val);
    void pushEnd(int val);
    int selectNode(int val);
    void clearList();
    bool deleteNode(int val);
 
    void printList();
    int getCount();
 
 
public:
    MyList() : count(0),end(NULL),first(NULL) {}
   ~MyList();
};
MyList.cpp
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
MyList::~MyList(){
    while (first)
         {
              node *ptr = first;
              first = ptr->next;
              delete ptr;
         }
         end = first;
}
 
void MyList::pushFirst(int val){
    first=new node(val,first,NULL);
    if(!count)
            end = first;
       node *ptr = first->next;
       if(ptr)
            ptr->prev = first;
 
       count++;
}
 
void MyList::pushEnd(int val){
end = new node(val, NULL, end);
 
   if (!count)
      first = end;
 
   node *ptmp = end->prev;
   if (ptmp)
      ptmp->next = end;
 
   count++;
}
 
void MyList::printList(){
    node * ptmp=first;
    int a=1;
    while(ptmp){
        std::cout<<"Узел № "<<a<<" Данные: "<<ptmp->data<<" "<<std::endl;
        ptmp=ptmp->next;
        a++;
    }
    std::cout<<std::endl;
 
}
 
int MyList::getCount(){
  return count;
}
 
void MyList::clearList(){
    while (first)
         {
              node *ptr = first;
              first = ptr->next;
              delete ptr;
         }
         end = first;
 
         count = 0;
}
 
 
int MyList::selectNode(int val){
    if(!count || !val || val>count+1)
            return 0;
 
       int tmp=0;
 
       node *ptmp = first;
 
       while (ptmp)
       {
            tmp++;
            if (val==tmp)
                 return ptmp->data;
            ptmp = ptmp->next;
       }
}
 
bool MyList::deleteNode(int val){
    if(!count || !val || val>count+1)
             return false;
 
        int tmp=0;
 
        node *ptmp = first;
 
        while (ptmp)
        {
             tmp++;
             if (val==tmp) {
                  node *ptr_prev = ptmp->prev;
                  node *ptr_next = ptmp->next;
 
                  if(ptr_prev)
                       ptr_prev->next = ptr_next;
                  if(ptr_next)
                       ptr_next->prev = ptr_prev;
 
                  delete ptmp;
 
                  count--;
                  return true;
             }
             ptmp = ptmp->next;
        }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.03.2013, 01:42     Двусвязный список с объектом трех типов: "целое число", "вещественное число", "строка"
Посмотрите здесь:

Дано вещественное число A и целое число N C++
Вычислить значение выражения C++
Дано вещественное число a, целое n. Вычислить: a (a-1) (a-2).(a-n) C++
C++ Дано вещественное число A и целое число N (> 0)
Даны вещественное число x и целое число n > 0 C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
30.03.2013, 02:16     Двусвязный список с объектом трех типов: "целое число", "вещественное число", "строка" #2
Делаете класс элементов списка. Список состоит из объектов этого класса. Поля класса: объединение переменных всех возможных типов и перечисление этих самых типов как констант. Как создавать подобные значения и превращать их в обычные, думаю, догадаетесь.
egor2116
 Аватар для egor2116
337 / 368 / 42
Регистрация: 20.01.2013
Сообщений: 1,100
30.03.2013, 02:26  [ТС]     Двусвязный список с объектом трех типов: "целое число", "вещественное число", "строка" #3
Если честно не совсем понятно зачем выносить объединение в другой класс, а так сделать нельзя ?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class MyList
{
private:
   union data {
        int whole;
        double real;
        string str;
       };
 
    int count;
 
    struct node {
        data dat;
        node * next;
        node * prev;
        node(int d,node * f,node * p) : dat(d),next(f),prev(p) {}
        ...
        };
Если нет, не могли бы вы привести пример.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
30.03.2013, 03:39     Двусвязный список с объектом трех типов: "целое число", "вещественное число", "строка" #4
Да можно. Это ж всё равно другой класс — MyList::data. Но всё равно необходим способ узнать, что именно лежит в элементе: число или там строка.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
30.03.2013, 10:35     Двусвязный список с объектом трех типов: "целое число", "вещественное число", "строка" #5
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Да можно. Это ж всё равно другой класс — MyList::data. Но всё равно необходим способ узнать, что именно лежит в элементе: число или там строка.
Попахивает введением переменной для определения типа класса. Не замахнуться ли нам на полиморфизм?
Yandex
Объявления
30.03.2013, 10:35     Двусвязный список с объектом трех типов: "целое число", "вещественное число", "строка"
Ответ Создать тему
Опции темы

Текущее время: 00:58. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru