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

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

Войти
Регистрация
Восстановить пароль
 
Locust
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 82
#1

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

29.09.2013, 00:14. Просмотров 704. Ответов 11
Метки нет (Все метки)

Доброго времени суток.

Задание такое:
Структура: список однонаправленный.
Реализовать функции:
- сформировать список;
- добавить элемент в произвольное место списка перед элементом с заданным номером (номер ввести с клавиатуры);
- удалить заданный элемент.
Сформировать списки 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;
    }
}


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

Формирование двух других массивов из одного исходного - C++
Помогите пожалуйста написать код.Задано массив a1,a2...a2n.Написать программу построения массива x1,x2....xn и y1,y2,....yn елементы...

Формирование двух других массивов из одного исходного одномерного массива - C++
Помогите пожалуйста написать полностю код.Вот задание:&quot;Задано массив a1,a2...a2n.Написать программу построения массива x1,x2....xn и...

Задача на формирование списков - C++
Всем привет! Помогите исправить ошибку. Условие программы: &quot;Сформировать списки L1 и L2 из списка L по следующему правилу: в L1 четные...

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

Объединение двух списков - C++
Помогите пожалуйста с решением следующей задачи. Нужно добавить функцию для объединения двух списков. #include &lt;iostream&gt; ...

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

11
monolit
186 / 185 / 22
Регистрация: 24.03.2011
Сообщений: 669
Завершенные тесты: 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; //<<------ забыла.
    }
}
0
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'а после него нет. Сейчас буду исправлять.
0
Миниатюры
Формирование двух новых списков из исходного  
Locust
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 82
29.09.2013, 17:32  [ТС] #4
С Add вроде разобралась: всего-то надо было в цикле заместо i<N поставить i<N-1 (тогда pointer будет указывать на то, что нужно, я ведь перед указанным элементом temp добавляю).
Но Task до сих пор не выполняется.
0
monolit
186 / 185 / 22
Регистрация: 24.03.2011
Сообщений: 669
Завершенные тесты: 1
29.09.2013, 21:05 #5
Цитата Сообщение от Locust Посмотреть сообщение
вякает на temp->Next=pointer->Next; и поделом, ибо этот самый pointer у меня крайний, и никакого Next'а после него нет
Вставка происходит после pointer, где бы он не находился. А так просто переставляются связи, так что тут никаких ошибок быть не должно (как выяснилось, в индексации дело).
И вот тут заменить на нестрогое неравенство
C++
1
if(N<=size)
Скорее всего, даже не в цикле дело, а именно тут.
0
Locust
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 82
29.09.2013, 22:16  [ТС] #6
Цитата Сообщение от monolit Посмотреть сообщение
if(N<=size)
- туплю немного под вечер, это в Add, где проверяем, не превышает ли введённое число количества элементов? Оно вроде и так нестрогое.
Где именно?
_________
И дык что же может быть в Task'е? Никак не могу найти ошибку.

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


Всякие там защиты от дураков и прочую эстетику наводить буду, когда с основной задачей разберусь.
0
monolit
186 / 185 / 22
Регистрация: 24.03.2011
Сообщений: 669
Завершенные тесты: 1
30.09.2013, 22:56 #11
Черт подери, вот в чем дело) У тебя списки формируются, но они локальные, т.е. их область видимости - непосредственно функция, где они используются.
Сделай так:
C++
1
void List::Task(List& L1,List& L2)
1
Locust
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 82
30.09.2013, 23:14  [ТС] #12
Гениально! Спасибо огромное, что бы я без Вас делала!..
0
30.09.2013, 23:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.09.2013, 23:14
Привет! Вот еще темы с ответами:

Слияние двух отсортированных списков - C++
Напишите функцию List&amp; merge(List&amp; L1, List&amp; L2), добавляю- щую к упорядоченному списку L1 также упорядоченный список L2 и ...

Слияние двух списков(срочно!) - C++
Даны два списка, нужно их склеить. Вот, написал, но при комплияции выдаются неведомые мне ошибки. Кто-нибудь из опытных людей может мне...

Найти объединение двух списков - C++
Помогите мне решить задачку, я в принципе не понимаю как её решать, вот её условие. Найти объединение двох списков,тоисть получить такой...

Объединение (конкатенация) двух односвязных списков - C++
Задача: Построить стек (односвязный список). Показать реализацию стека на следующем примере: сцепить два связанных списка данных...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

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