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

Реализовать двухсвязный список. Каждый элемент списка может содержать один объект - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.68
SweetHeart
0 / 0 / 0
Регистрация: 15.02.2012
Сообщений: 6
15.02.2012, 18:20     Реализовать двухсвязный список. Каждый элемент списка может содержать один объект #1
Здравствуйте, мне нужно было реализовать двухсвязный список. Каждый элемент списка может содержать один объект. Объект может быть трех типов: "целое число",
"вещественное число", "строка". В разных узлах одного списка может
быть любой объект одного из допустимых типов. Каждый объект должен
иметь возможность вывести свое содержимое на консоль. У списка должен
быть метод, выводящий все элементы. Но я не знаю как реализовать то что объект может быть 3-х типов. Может перегрузку попробовать, но как тогда структуру Element объявить? Помогите если не трудно. Вот что я сделала для одного типа string:

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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
#include <iostream>
#include <conio.h>
#include <string.h>
 
using namespace std;
 
struct Element                              
{
public:
string data;
Element *next;  
Element *pred;
};
 
class List
{
public:
 Element *pHead;
 Element *pPrev;
 int countElem;  
 
List(); //конструктор
~List(); //деструктор
         void addToList(string data);   //функция добавки элемента в список
         void printElem(int numb);//функция вывода на кран заданного элемента списка
         void printList(); //функция вывода на кран всех элементов списка
         void delAllList(); 
         
};
 
 
List::List() //реализация конструктора
{
 pHead = NULL;
 pPrev = NULL;
 countElem = 0;
}
 
 
List::~List() //реализация деструктора
{
delAllList();
}
 
 
void List::addToList(string data)   //реализация функции добавления
{
    Element *temp = new Element;    
    if(pHead == NULL)               
    {
        temp->pred = NULL;          
        temp->next = NULL;          
        pHead = temp;               
    }
    else                            
        pPrev->next = temp;         
 
    temp->data = data;          
    temp->next = NULL;          
    temp->pred = pPrev;
    pPrev = temp;
    countElem++;
 
}
 
void List::printList() //реализация функции вывода на экран списка
{
  Element *pTemp = pHead;  
 
if (pHead == NULL)
{
cout << "Spisok pust";
}
else
{
  cout << "Spisok : ";
 
  while(pTemp != NULL)  
{
  cout << pTemp->data + ' '; 
  pTemp = pTemp->next;  
}
 
cout << endl;
}
}
 
 
void List::printElem(int numb) //функция вывода элемента
{
 Element *pTemp = pHead;
 
 if ((numb>countElem) || (numb<1))  
  cout << "Takogo elementa net" << endl; 
else
{
  for(int i=1; i!=numb; i++) 
{
pTemp = pTemp->next;
}
 
   cout << "Element with number  " << numb <<"  is  "<<pTemp->data << endl;
return;
}
 
};
void List::delAllList()             //реализация удаления всех элементов списка
{
    while(pHead != NULL)            
    {
        Element *pTemp = pHead;     
        pHead = pHead->next;        
        delete pTemp;               
    }
 
    pHead = NULL;
    pPrev = NULL;
}
 
void CinList(List *ls); //функция для ввода данных в список
 
  List lst;  
  char ch;  
  string str;
  
int main()
{
bool exit = false; 
 
  cout << "Vvedite spisok elementov tipa string zakonchiv - '!' " << endl;
 
CinList(&lst);
 
while (exit == false)
{
cout << "=============================================================" << endl;
cout << "Viberite deystvie" << endl;
cout << "1 - Vivesti n-i element" << endl;
cout << "2 - Vivesti vse elementi" << endl;
cout << "0 - Vihod" << endl;
cout << "=============================================================" << endl;
 
  cin >> ch;
  switch(ch)  
{
  
  case '2':
lst.printList();
getch();
break;
 
  case '1':
int num;
  cout << "Vvedite nomer elementa dlya vivoda: ";
  cin >> num;
 lst.printElem(num);
getch();
break;
 
case '0':
exit = true;
break;
 
default:
exit = true;
}
}
 
return 0;
}
 
void CinList(List *ls) //функция для ввода данных в список
{
str = "";
 
for (int i = 0; cin.get(ch); ++i) 
{
if (ch == '!')
{
ls->addToList(str);
str = "";
i = 0;
break;
}
 
if (ch == ' ')
{
ls->addToList(str);
str = "";
i = 0;
}
 
if (ch != ' ') str = str + ch;
 
}
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.02.2012, 18:20     Реализовать двухсвязный список. Каждый элемент списка может содержать один объект
Посмотрите здесь:

C++ [C++]Один объект не может дополнить другой.
C++ Шаблон двухсвязный список, храним указатель не элемент
класс не может содержать список аргументов шаблона C++
C++ Реализовать класс "двухсвязный список"
Реализовать двусвязный список. В разных узлах одного списка может быть любой объект одного из допустимых типов (своих знаний не хватает) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
15.02.2012, 18:58     Реализовать двухсвязный список. Каждый элемент списка может содержать один объект #2
можно хранить числа в строковом представлении. можно хранить обьект как void*, можно сделать наподобие boost::any
SweetHeart
0 / 0 / 0
Регистрация: 15.02.2012
Сообщений: 6
15.02.2012, 19:21  [ТС]     Реализовать двухсвязный список. Каждый элемент списка может содержать один объект #3
в строковом нельзя. тоесть мне переменную data в структуре сделать типа void? а как потом определить какой объект целое, какой вещественное, а какой строка?
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
15.02.2012, 19:30     Реализовать двухсвязный список. Каждый элемент списка может содержать один объект #4
не void, а void*.
но в таком случае придется хранить информацию о типе.
например можно добавить
C++
1
2
3
4
5
6
enum object_type
{
    INTEGER,
    DECIMAL,
    STRING
};
и в классе придется хранить не только объект, но и переменную типа object_type
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
15.02.2012, 19:41     Реализовать двухсвязный список. Каждый элемент списка может содержать один объект #5
Цитата Сообщение от SweetHeart Посмотреть сообщение
а как потом определить какой объект целое, какой вещественное, а какой строка?
Чем boost::any не подходит?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <vector>
#include <boost/any.hpp>
 
int main()
{
   std::vector<boost::any> v;
   
   v.push_back(2);
   v.push_back(std::string("hello"));
   
   std::cout << (v[0].type() == typeid(int))          << std::endl
             << (v[0].type() == typeid(float))        << std::endl
             << (v[1].type() == typeid(std::string))  << std::endl;
}
http://liveworkspace.org/code/798566...71108bf60e6761
Код
1
0
1
retmas
15.02.2012, 19:41
  #6

Не по теме:

Цитата Сообщение от go Посмотреть сообщение
Чем boost::any не подходит?
предлагал, но похоже ТС не хочет
по моему многих пугает само слово boost

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.02.2012, 14:56     Реализовать двухсвязный список. Каждый элемент списка может содержать один объект
Еще ссылки по теме:

C++ Какой элемент останется в кольце последним, если начать по очереди удалять из списка каждый n элемент
C++ однонаправленный список элементов (удвоить каждый элемент списка)
Может ли объект-член, или объект-элемент достучаться к содержащему его? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
SweetHeart
0 / 0 / 0
Регистрация: 15.02.2012
Сообщений: 6
16.02.2012, 14:56  [ТС]     Реализовать двухсвязный список. Каждый элемент списка может содержать один объект #7
а если у меня Dev-C++ ругается на boost и typeid? подскажите где найти библиотеки для них
Yandex
Объявления
16.02.2012, 14:56     Реализовать двухсвязный список. Каждый элемент списка может содержать один объект
Ответ Создать тему
Опции темы

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