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

Связанный список (Linked list). - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
lnter
0 / 0 / 0
Регистрация: 02.12.2008
Сообщений: 11
12.04.2010, 18:05     Связанный список (Linked list). #1
Добрый день.
Вот пишу функцию (в коде название - smash), которая бы из текущего списка создавала 2 других: парные числа и непарные, но почему-то отказывается работать. Может кто могбы подсказать, в чем проблема?

Код:

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
struct elem
{
    int num;
    elem *next;
};
 
void print_list (elem *first)
{
    for (elem *p = first; p!=NULL; p=p->next)
    {
        cout << p->num << endl;
        if (p == NULL) break;
    };
};
 
void delete_list (elem*&first)
{
    elem *p = first;
    while (p!=NULL)
    {
        first = first->next;
        delete p;
        p = first;
    };
};
 
 
void smash(elem*&first)
{
  elem *odd = new elem;
  elem *nodd = new elem;
  elem *fir=NULL, *las=NULL; 
  elem *fir2=NULL, *las2=NULL; 
  elem *p = first;
    while (p!=NULL)
    {
        if (p->num%2 == 0) 
        {
            odd->num = p->num;
            odd->next = NULL;
            if (fir == NULL) fir = odd;
            else las->next = odd;
            las = odd;
            //cout << "odd: " << odd->num << endl;  
            p=p->next;  
        } 
        else
        {
            nodd->num = p->num;
            nodd->next = NULL;
            if (fir2 == NULL) fir2 = nodd;
            else las2->next = nodd;
            las2 = nodd;
            //cout << "nodd: " <<nodd->num << endl;
            p=p->next;
        };
    };
    print_list(fir);
    print_list(fir2);
    delete_list(fir);
    delete_list(fir2);
};
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Sekt
 Аватар для Sekt
156 / 155 / 10
Регистрация: 29.04.2009
Сообщений: 637
12.04.2010, 20:16     Связанный список (Linked list). #2
C++
1
void smash(elem*&first)
что ето значит? А вариант создания 2ух объектов и возр.указателя нельзя?
GAME
 Аватар для GAME
22 / 22 / 3
Регистрация: 31.10.2009
Сообщений: 199
12.04.2010, 21:02     Связанный список (Linked list). #3
Цитата Сообщение от Sekt Посмотреть сообщение
что ето значит?
согласен.нельзя использовать указатель и ссылку в одном месте.тут указателя достаточно будет
lnter
0 / 0 / 0
Регистрация: 02.12.2008
Сообщений: 11
12.04.2010, 23:08  [ТС]     Связанный список (Linked list). #4
Всё равно не работает ):
Alex5
881 / 616 / 81
Регистрация: 12.04.2010
Сообщений: 1,552
13.04.2010, 00:03     Связанный список (Linked list). #5
Цитата Сообщение от lnter Посмотреть сообщение
Вот пишу функцию (в коде название - smash), которая бы из текущего списка создавала 2 других
А как создаётся список, с которым smash() работает? Может быть, список создан неправильно.
Если перед вызовом smash() вызвать print_list() ?
C++
1
2
print_list(p); 
smash(p);
Что выведет print_list ?
GAME
 Аватар для GAME
22 / 22 / 3
Регистрация: 31.10.2009
Сообщений: 199
13.04.2010, 17:19     Связанный список (Linked list). #6
Цитата Сообщение от lnter Посмотреть сообщение
Всё равно не работает ):


Неработает всмысле некомпилиться? или не работает как надо ?

Если не работает как надо , то надобы наверно поменять тип функции , чтобы она возвращала указатель на новый список.
lnter
0 / 0 / 0
Регистрация: 02.12.2008
Сообщений: 11
14.04.2010, 20:28  [ТС]     Связанный список (Linked list). #7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void add_element (elem*&first, elem*&last, int i)
{
    elem *p = new elem;
    p->num = i;
    p->next = NULL;
    if (first == NULL) first = p;
    else last->next = p;
    last = p;
};
void print_list (elem *first)
{
    for (elem *p = first; p!=NULL; p=p->next)
    {
        cout << p->num << endl;
        if (p == NULL) break;
    };
};
Все элементы вводятся вручную и создаётся список. Всё работает, кроме функции smash (не работает так, как надо). Если использовать print_list для созданных в этой функции списков, то почему-то зацикливается и постоянно выводиться последний элемент. Пробовал вывести первый - тоже последний выводит.
GAME
 Аватар для GAME
22 / 22 / 3
Регистрация: 31.10.2009
Сообщений: 199
14.04.2010, 21:06     Связанный список (Linked list). #8
Цитата Сообщение от lnter Посмотреть сообщение
(не работает так, как надо)
.....Удалил сообение
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.04.2010, 23:02     Связанный список (Linked list).
Еще ссылки по теме:

Linked List описание C++
C++ Связанный список. List, не могу найти ошибку в куске кода
Linked List: error C2360: initialization of 'vp' is skipped by 'case' label C++

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

Или воспользуйтесь поиском по форуму:
Alex5
881 / 616 / 81
Регистрация: 12.04.2010
Сообщений: 1,552
14.04.2010, 23:02     Связанный список (Linked list). #9
Рассмотрим список *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() ?
Yandex
Объявления
14.04.2010, 23:02     Связанный список (Linked list).
Ответ Создать тему
Опции темы

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