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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.68
SweetHeart
0 / 0 / 0
Регистрация: 15.02.2012
Сообщений: 6
#1

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

15.02.2012, 18:20. Просмотров 2450. Ответов 6
Метки нет (Все метки)

Здравствуйте, мне нужно было реализовать двухсвязный список. Каждый элемент списка может содержать один объект. Объект может быть трех типов: "целое число",
"вещественное число", "строка". В разных узлах одного списка может
быть любой объект одного из допустимых типов. Каждый объект должен
иметь возможность вывести свое содержимое на консоль. У списка должен
быть метод, выводящий все элементы. Но я не знаю как реализовать то что объект может быть 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++
Сформировать однонаправленный список элементов типа char и написать программу следующих операций над ним: а) удвоить каждый элемент списка.

Шаблон двухсвязный список, храним указатель не элемент - C++
#include &lt;cstdlib&gt; #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &quot;DSpisok.h&quot; using namespace std; int main(int argc, char...

класс не может содержать список аргументов шаблона - C++
я создал шаблон заменил его в коде вместо vector и теперь везде на месте myvector пишет class &quot;myvector&quot; не может содержать список...

Может ли объект-член, или объект-элемент достучаться к содержащему его? - C++
Предположим, class A { ... }; class B { .... A a; ... };

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
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
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
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++
3586 / 1366 / 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

SweetHeart
0 / 0 / 0
Регистрация: 15.02.2012
Сообщений: 6
16.02.2012, 14:56  [ТС] #7
а если у меня Dev-C++ ругается на boost и typeid? подскажите где найти библиотеки для них
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.02.2012, 14:56
Привет! Вот еще темы с ответами:

Реализовать класс "Двухсвязный список" - C++
Помогите напить программу. Нужно из готового кода написать программу, которая бы создавала линейный односвязный (двухсвязный) список. Из...

Реализовать класс "двухсвязный список" - C++
Реализовать двухсвязный список. Каждый элемент списка может содержать один объект. Объект может быть трех типов: &quot;целое число&quot;,...

Один объект не может дополнить другой - C++
Есть два объекта,принадлежащие этому классу. #include &quot;value_class.h&quot; class Variable { private: ...

Какой элемент останется в кольце последним, если начать по очереди удалять из списка каждый n элемент - C++
Создать структуру с именем Subject с полями: фамилия, имя. Сформиро-вать замкнутое кольцо (односвязный список, у которого последний...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
16.02.2012, 14:56
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru