Рассмотрим список *odd
Вы создали один элемент этого списка. А где создаются 2-й 3-й ...
C++ |
1
2
3
4
| void smash(elem*&first)
{
elem *odd = new elem;
elem *nodd = new elem; |
|
Например, first указывает на список, состоящий из 12, 14, 16, 18
В процедуре smash будут выполнены присваивания одному и тому же элементу
C++ |
1
2
3
4
| odd->num = 12;
odd->num = 14;
odd->num = 16;
odd->num = 18; |
|
и мы получим один элемент, значение поля "num" у которого 18
Допустим, мы имеем список 12, 14, 16, 18
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
| while (p!=NULL) p-> (12, ...) odd->(..., ...) fir == NULL
{
if (p->num%2 == 0)
{
odd->num = p->num; p-> (12, ...) odd->(12, ...) fir == NULL
odd->next = NULL; p-> (12, ...) odd->(12, NULL) fir == NULL
if (fir == NULL) fir = odd; p-> (12, ...) fir == odd -> (12, NULL)
else las->next = odd;
las = odd; p-> (12, ...) odd == fir == las -> (12, NULL)
//cout << "odd: " << odd->num << endl;
p=p->next;
}
Следующая итерация цикла
if (p->num%2 == 0) p->num == 14
{
odd->num = p->num; p-> (14, ...) odd == fir == las -> (14, NULL)
odd->next = NULL; p-> (14, ...) odd == fir == las -> (14, NULL)
if (fir == NULL) fir = odd;
else las->next = odd; p-> (14, ...) odd == fir == las -> (14, odd)
las = odd; p-> (14, ...) odd == fir == las -> (14, odd)
// Мы получили : все указатели odd, fir, las равны и указывают на объект,
// у которого num == 14 next == odd Т.е. он указывает на самого себя
//cout << "odd: " << odd->num << endl;
p=p->next;
} |
|
Добавлено через 14 минут
C++ |
1
| void add_element (elem*&first, elem*&last, int i) |
|
Почему Вы не используете add_element() в smash() ?