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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
lnter
0 / 0 / 0
Регистрация: 02.12.2008
Сообщений: 11
#1

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

12.04.2010, 18:05. Просмотров 1221. Ответов 8
Метки нет (Все метки)

Добрый день.
Вот пишу функцию (в коде название - 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);
};
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.04.2010, 18:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Связанный список (Linked list). (C++):

Указатели, связной список (Linked List) и динамическое выделение памяти - C++
Я вообще не понимаю как сделать. Ребят! Помогите, как сможете! /* Написать связной список используя структуры и функции Позволить...

Связанный список. List, не могу найти ошибку в куске кода - C++
Программа работает, но работает не правильно. Суть функции, создается список, заполняется, потом надо по нужным условиям найти элементы и...

Linked List класс - C++
Ребят! Помогите пожалуйста найти ошибку! Я все написал, но чтобы я не делал выбрасывает с ошибкой:( //List.h #pragma once ...

Linked List описание - C++
/*!Begin Snippet:filebegin*/ #ifndef _LINKEDLIST_H_ #define _LINKEDLIST_H_ using namespace std; /*!Begin Snippet:fullnode*/ ...

C-style Linked List - C++
Итак, изучал я, значит, C-style Linked List (не знаю, как будет по-русски) и столкнулся с такой проблемой: надо его заполнить. Вроде все...

Template double linked list C++ - C++
Пытался реализовать шаблон класса двусвязный список, элементарами которого является класс структура. 1. Как теперь инициализировать класс...

8
Sekt
156 / 155 / 10
Регистрация: 29.04.2009
Сообщений: 637
12.04.2010, 20:16 #2
C++
1
void smash(elem*&first)
что ето значит? А вариант создания 2ух объектов и возр.указателя нельзя?
0
GAME
23 / 23 / 3
Регистрация: 31.10.2009
Сообщений: 199
12.04.2010, 21:02 #3
Цитата Сообщение от Sekt Посмотреть сообщение
что ето значит?
согласен.нельзя использовать указатель и ссылку в одном месте.тут указателя достаточно будет
0
lnter
0 / 0 / 0
Регистрация: 02.12.2008
Сообщений: 11
12.04.2010, 23:08  [ТС] #4
Всё равно не работает ):
0
Alex5
1056 / 720 / 108
Регистрация: 12.04.2010
Сообщений: 1,847
13.04.2010, 00:03 #5
Цитата Сообщение от lnter Посмотреть сообщение
Вот пишу функцию (в коде название - smash), которая бы из текущего списка создавала 2 других
А как создаётся список, с которым smash() работает? Может быть, список создан неправильно.
Если перед вызовом smash() вызвать print_list() ?
C++
1
2
print_list(p); 
smash(p);
Что выведет print_list ?
0
GAME
23 / 23 / 3
Регистрация: 31.10.2009
Сообщений: 199
13.04.2010, 17:19 #6
Цитата Сообщение от lnter Посмотреть сообщение
Всё равно не работает ):


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

Если не работает как надо , то надобы наверно поменять тип функции , чтобы она возвращала указатель на новый список.
0
lnter
0 / 0 / 0
Регистрация: 02.12.2008
Сообщений: 11
14.04.2010, 20:28  [ТС] #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 для созданных в этой функции списков, то почему-то зацикливается и постоянно выводиться последний элемент. Пробовал вывести первый - тоже последний выводит.
0
GAME
23 / 23 / 3
Регистрация: 31.10.2009
Сообщений: 199
14.04.2010, 21:06 #8
Цитата Сообщение от lnter Посмотреть сообщение
(не работает так, как надо)
.....Удалил сообение
0
Alex5
1056 / 720 / 108
Регистрация: 12.04.2010
Сообщений: 1,847
14.04.2010, 23:02 #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() ?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.04.2010, 23:02
Привет! Вот еще темы с ответами:

Проверить программу с linked list - C++
Есть программа, но уверен много недочётов - сам не вижу. Например, правильно ли описаны private member? Так же не понятно с VALUE...

Нужен совет - как сделать circular linked list? - C++
Доброго всем времени суток!!! У меня программа которая считает queue, мне необходимо сделать circular linked list. Прошу помоши!!!!!...

Linked List: error C2360: initialization of 'vp' is skipped by 'case' label - C++
Программа выдает ошибку . но я не понял в чем проблема . можете помочь исправить ? class Us { public: Us* prev; int k; ...

Связанный список. Создать, записать в связный список последовательность слов,обозначающих месяцы года,заданных пользователем - C++
Создать связанный список.Кроме информационных полей он должен обязательно содержать указатели на предыдущий и следующий за ним...


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

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

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