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

Формирование двух новых списков из исходного - C++

Восстановить пароль Регистрация
 
Locust
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 82
29.09.2013, 00:14     Формирование двух новых списков из исходного #1
Доброго времени суток.

Задание такое:
Структура: список однонаправленный.
Реализовать функции:
- сформировать список;
- добавить элемент в произвольное место списка перед элементом с заданным номером (номер ввести с клавиатуры);
- удалить заданный элемент.
Сформировать списки L1 и L2 из списка L по следующему правилу: в L1 поместить четные положительные элементы списка L, в L2 - нечетные отрицательные элементы списка L.
Подсчитать количество компонентов в списках L1 и L2.

Код моего варианта программы:

Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <conio.h>
#include "Unit1.cpp"
 
using namespace std;
 
void main()
{
    List(L);
    List(L1);
    List(L2);
    int currentElem,i=0;
    unsigned short int flag=1;
 
    std::cout<<"Please enter the first element of your list\n";
    while(flag==1)
    {
        std::cin>>currentElem;
        L.Add(currentElem,i);
        i++;
        std::cout<<"Do you want to continue (1) or to do the task (2)?  ";
        std::cin>>flag;
    }
    L.Task(L1,L2);
 
    L.Show();
    std::cout<<"\nThe list with positive even numbers consists of "<<L1.Count()<<" elements:\n";
    L1.Show();
    std::cout<<"\nThe list with negative odd numbers consists of "<<L2.Count()<<" elements:\n";
    L2.Show();
 
    getch();
}


Модуль с описанием класса и функциями:

Кликните здесь для просмотра всего текста
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
#include <iostream.h>
 
struct element
{
    int x;
    element *Next;
};
 
class List
{
public:
    List();
    ~List();
 
    void Add(const int x,const int N); 
    void Show();
    void Delete(const int N);
    void Task(List L1,List L2);
    int Count(); 
 
private:
    element *Head;
    int size;
};
 
bool positiveEven(int elem)
{
    return(elem>0)&&(elem%2==0);
}
 
bool negativeOdd(int elem)
{
    return(elem<0)&&(elem%2!=0);
}
 
int List::Count()
{
    return size;
}
 
List::List()
{
    Head=NULL;
    size=0;
};
 
List::~List()
{
    while(Head!=NULL)  
     {    
        element *temp=Head->Next;
        delete Head; 
        Head=temp;   
     }
}
 
void List::Add(const int x,const int N)
{
    size++;
    element *temp=new element; 
    element *pointer=Head; 
 
    if(Head!=NULL) 
    {
        if(N<=size) 
        {
            for(int i=0;i<N;i++)
                pointer=pointer->Next; 
            temp->x=x; 
            temp->Next=pointer->Next; 
        }
        else
            std::cout<<"Incorrect number: your list consists of less then "<<N<<" elements";
    }
    else
    {
        temp->x=x;
        temp->Next=NULL;
    }
}
 
void List::Show()
{
    element *temp=Head;
 
    while(temp!=NULL)
    {
        cout<<temp->x<<" ";
        temp=temp->Next;
    }
}
 
void List::Delete(const int N)
{
    element *temp=Head;
    if((Head!=NULL)&&(N<=size))
    {
        if(N<size)
        {
            for(int i=0;i<N-1;i++)
                temp=temp->Next;
            temp->Next=temp->Next->Next;
        }
        if(N==size)
        {
            for(int i=0;i<N-1;i++)
                temp=temp->Next;
            temp->Next=NULL;
        }
        delete temp;
    }
    size--;
}
 
void List::Task(List L1,List L2)
{
    element *temp=Head;
 
    while(temp!=NULL)
    {
        if(positiveEven(temp->x))
            L1.Add(temp->x,0);
        if(negativeOdd(temp->x))
            L2.Add(temp->x,0);
        temp=temp->Next;
    }
}


Не хочет выводить списки и считать их размер. Судя по всему, и формировать их не хочет. Наверное, накосячила с добавлением элемента. Подскажите, пожалуйста, где ошибка. Вообще, за любую конструктивную критику буду очень благодарна.
Миниатюры
Формирование двух новых списков из исходного  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.09.2013, 00:14     Формирование двух новых списков из исходного
Посмотрите здесь:

C++ Сравнение двух списков
Объединение (конкатенация) двух односвязных списков C++
C++ Слияние двух списков(срочно!)
C++ Слияние двух отсортированных списков
C++ Задача на формирование списков
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
monolit
179 / 179 / 21
Регистрация: 24.03.2011
Сообщений: 641
Завершенные тесты: 1
29.09.2013, 01:20     Формирование двух новых списков из исходного #2
Цитата Сообщение от Locust Посмотреть сообщение
List(L);
* * List(L1);
* * List(L2);
Здесь, наверное, подразумевалось
C++
1
2
3
List L();
List L1();
List L2();
Добавлено через 6 минут
А насчет добавления, вот (немного не правильно):
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
void List::Add(const int x,const int N)
{
    ++size;
    element *temp=new element;
    temp->x=x; 
 
    if(Head!=NULL) 
    { 
        element *pointer=Head; 
        if(N<=size) 
        {
            for(int i=0;i<N;++i) pointer=pointer->Next; 
            temp->Next=pointer->Next; 
            pointer->Next = temp; //<<------ забыла.   предыдущий --> pointer --> temp -->
        }
        else
            std::cout<<"Incorrect number: your list consists of less then "<<N<<" elements";
    }
    else
    {
        temp->Next=NULL;
        Head = temp; //<<------ забыла.
    }
}
Locust
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 82
29.09.2013, 15:59  [ТС]     Формирование двух новых списков из исходного #3
Цитата Сообщение от monolit Посмотреть сообщение
List L();
List L1();
List L2();
- с замечанием полностью согласна, спасибо. Но в таком случае появляются какие-то жалобы на методы (на скриншоте их видно).
_______
Решила потестить уже после добавления Head = temp. Компилятор вякает на temp->Next=pointer->Next; и поделом, ибо этот самый pointer у меня крайний, и никакого Next'а после него нет. Сейчас буду исправлять.
Миниатюры
Формирование двух новых списков из исходного  
Locust
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 82
29.09.2013, 17:32  [ТС]     Формирование двух новых списков из исходного #4
С Add вроде разобралась: всего-то надо было в цикле заместо i<N поставить i<N-1 (тогда pointer будет указывать на то, что нужно, я ведь перед указанным элементом temp добавляю).
Но Task до сих пор не выполняется.
monolit
179 / 179 / 21
Регистрация: 24.03.2011
Сообщений: 641
Завершенные тесты: 1
29.09.2013, 21:05     Формирование двух новых списков из исходного #5
Цитата Сообщение от Locust Посмотреть сообщение
вякает на temp->Next=pointer->Next; и поделом, ибо этот самый pointer у меня крайний, и никакого Next'а после него нет
Вставка происходит после pointer, где бы он не находился. А так просто переставляются связи, так что тут никаких ошибок быть не должно (как выяснилось, в индексации дело).
И вот тут заменить на нестрогое неравенство
C++
1
if(N<=size)
Скорее всего, даже не в цикле дело, а именно тут.
Locust
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 82
29.09.2013, 22:16  [ТС]     Формирование двух новых списков из исходного #6
Цитата Сообщение от monolit Посмотреть сообщение
if(N<=size)
- туплю немного под вечер, это в Add, где проверяем, не превышает ли введённое число количества элементов? Оно вроде и так нестрогое.
Где именно?
_________
И дык что же может быть в Task'е? Никак не могу найти ошибку.

Параллельно сейчас доделываю ещё одну лабу, в ней тоже чёртова куча ошибок, поэтому голова не варит совершенно. Многозадачность всё-таки отрицательно влияет на качество выполняемой работы, по крайней мере у людей.
monolit
179 / 179 / 21
Регистрация: 24.03.2011
Сообщений: 641
Завершенные тесты: 1
29.09.2013, 23:10     Формирование двух новых списков из исходного #7
твоя правда, на строгое) Оговорился)
Locust
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 82
29.09.2013, 23:20  [ТС]     Формирование двух новых списков из исходного #8
Спасибо.
____
Новые списки отказывается формировать, в чём, по-Вашему, может быть причина? Вроде логика такая: проходим по изначальному списку, встретив положительное чётное значение, запихиваем его в L1, отрицательное нечётное - в L2.
monolit
179 / 179 / 21
Регистрация: 24.03.2011
Сообщений: 641
Завершенные тесты: 1
30.09.2013, 15:11     Формирование двух новых списков из исходного #9
А у тебя точно в примере встречаются положительные четные и отр. нечетные?) если да, то скинь ка код еще раз, там ведь наверняка что-то с самого начала изменилось.
Locust
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 82
30.09.2013, 19:11  [ТС]     Формирование двух новых списков из исходного #10
Да пожалуйста...

Основной модуль:

Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <conio.h>
#include "Unit1.cpp"
 
using namespace std;
 
void main()
{
    List L();
    List L1();
    List L2();
    int currentElem,i=0;
    unsigned short int flag=1;
 
    std::cout<<"Please enter the first element of your list\n";
    while(flag==1)
    {
        std::cin>>currentElem;
        L.Add(currentElem,i);
        i++;
        std::cout<<"Do you want to continue (1) or to do the task (2)?  ";
        std::cin>>flag;
    }
    L.Task(L1,L2);
 
    L.Show();
    std::cout<<"\nThe list with positive even numbers consists of "<<L1.Count()<<" elements:\n";
    L1.Show();
    std::cout<<"\nThe list with negative odd numbers consists of "<<L2.Count()<<" elements:\n";
    L2.Show();
 
    getch();
}


Класс, методы и прочие вкусности:
Кликните здесь для просмотра всего текста
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
#include <iostream.h>
 
struct element
{
    int x;
    element *Next;
};
 
class List
{
public:
    List();
    ~List();
 
    void Add(const int x,const int N); // добавление такого-то элемента перед таким-то
    void Show();
    void Delete(const int N);
    void Task(List L1,List L2);
    int Count(); // функция подсчёта количества элементов, возвращает size
 
private:
    element *Head;
    int size;
};
 
bool positiveEven(int elem)
{
    return(elem>0)&&(elem%2==0);
}
 
bool negativeOdd(int elem)
{
    return(elem<0)&&(elem%2!=0);
}
 
int List::Count()
{
    return size;
}
 
List::List()
{
    Head=NULL;
    size=0;
};
 
List::~List()
{
    while(Head!=NULL)  // пока указатель на голову не покажет на 0
     {    
        element *temp=Head->Next; // временная переменная для хранения адреса следующего элемента
        delete Head; // освобождаем адрес, обозначающий начало
        Head=temp;   // меняем адрес на следующий
     }
}
 
void List::Add(const int x,const int N)
{
    size++;
    element *temp=new element; // выделяем память на новый элемент
    element *pointer=Head; // указатель на начало списка
 
    if(Head!=NULL) // проверяем, пуст ли список
    {
        if(N<size) // проверяем, не превышает ли введённое число количества элементов
        {
            for(int i=0;i<N-1;i++)
                pointer=pointer->Next; // движемся по списку до нужного номера
            temp->x=x; // записываем х в информационное поле нового элемента
            temp->Next=pointer->Next;
            pointer->Next=temp;
        }
        else
            std::cout<<"Incorrect number: your list consists of less then "<<N<<" elements";
    }
    else
    {
        temp->x=x;
        temp->Next=NULL;
        Head = temp;
    }
}
 
void List::Show()
{
    element *temp=Head;
    
    std::cout<<endl;
    while(temp!=NULL)
    {
        std::cout<<temp->x<<" ";
        temp=temp->Next;
    }
    std::cout<<endl;
}
 
void List::Delete(const int N)
{
    element *temp=Head;
    if((Head!=NULL)&&(N<=size))
    {
        if(N<size)
        {
            for(int i=0;i<N-1;i++)
                temp=temp->Next;
            temp->Next=temp->Next->Next;
        }
        if(N==size)
        {
            for(int i=0;i<N-1;i++)
                temp=temp->Next;
            temp->Next=NULL;
        }
        delete temp;
    }
    size--;
}
 
void List::Task(List L1,List L2)
{
    element *temp=Head;
 
    while(temp!=NULL)
    {
        if(positiveEven(temp->x))
            L1.Add(temp->x,0);
        if(negativeOdd(temp->x))
            L2.Add(temp->x,0);
        temp=temp->Next;
    }
}


Всякие там защиты от дураков и прочую эстетику наводить буду, когда с основной задачей разберусь.
monolit
179 / 179 / 21
Регистрация: 24.03.2011
Сообщений: 641
Завершенные тесты: 1
30.09.2013, 22:56     Формирование двух новых списков из исходного #11
Черт подери, вот в чем дело) У тебя списки формируются, но они локальные, т.е. их область видимости - непосредственно функция, где они используются.
Сделай так:
C++
1
void List::Task(List& L1,List& L2)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.09.2013, 23:14     Формирование двух новых списков из исходного
Еще ссылки по теме:

C++ Формирование двух других массивов из одного исходного
Формирование двух других массивов из одного исходного одномерного массива C++
C++ Объединение двух списков

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

Или воспользуйтесь поиском по форуму:
Locust
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 82
30.09.2013, 23:14  [ТС]     Формирование двух новых списков из исходного #12
Гениально! Спасибо огромное, что бы я без Вас делала!..
Yandex
Объявления
30.09.2013, 23:14     Формирование двух новых списков из исходного
Ответ Создать тему
Опции темы

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