Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
1 / 1 / 1
Регистрация: 09.11.2012
Сообщений: 82

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

29.09.2013, 00:14. Показов 2888. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.09.2013, 00:14
Ответы с готовыми решениями:

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

Обработка соответствующих элементов двух списков и формирование третьего
Даны два списка одинаковой длины. Получить третий список, каждый элемент равен 1, если элементы заданных списков с тем же номером имеют...

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

11
188 / 187 / 46
Регистрация: 24.03.2011
Сообщений: 670
29.09.2013, 01:20
Цитата Сообщение от 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
1 / 1 / 1
Регистрация: 09.11.2012
Сообщений: 82
29.09.2013, 15:59  [ТС]
Цитата Сообщение от monolit Посмотреть сообщение
List L();
List L1();
List L2();
- с замечанием полностью согласна, спасибо. Но в таком случае появляются какие-то жалобы на методы (на скриншоте их видно).
_______
Решила потестить уже после добавления Head = temp. Компилятор вякает на temp->Next=pointer->Next; и поделом, ибо этот самый pointer у меня крайний, и никакого Next'а после него нет. Сейчас буду исправлять.
Миниатюры
Формирование двух новых списков из исходного  
0
1 / 1 / 1
Регистрация: 09.11.2012
Сообщений: 82
29.09.2013, 17:32  [ТС]
С Add вроде разобралась: всего-то надо было в цикле заместо i<N поставить i<N-1 (тогда pointer будет указывать на то, что нужно, я ведь перед указанным элементом temp добавляю).
Но Task до сих пор не выполняется.
0
188 / 187 / 46
Регистрация: 24.03.2011
Сообщений: 670
29.09.2013, 21:05
Цитата Сообщение от Locust Посмотреть сообщение
вякает на temp->Next=pointer->Next; и поделом, ибо этот самый pointer у меня крайний, и никакого Next'а после него нет
Вставка происходит после pointer, где бы он не находился. А так просто переставляются связи, так что тут никаких ошибок быть не должно (как выяснилось, в индексации дело).
И вот тут заменить на нестрогое неравенство
C++
1
if(N<=size)
Скорее всего, даже не в цикле дело, а именно тут.
0
1 / 1 / 1
Регистрация: 09.11.2012
Сообщений: 82
29.09.2013, 22:16  [ТС]
Цитата Сообщение от monolit Посмотреть сообщение
if(N<=size)
- туплю немного под вечер, это в Add, где проверяем, не превышает ли введённое число количества элементов? Оно вроде и так нестрогое.
Где именно?
_________
И дык что же может быть в Task'е? Никак не могу найти ошибку.

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

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

Кликните здесь для просмотра всего текста
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
188 / 187 / 46
Регистрация: 24.03.2011
Сообщений: 670
30.09.2013, 22:56
Черт подери, вот в чем дело) У тебя списки формируются, но они локальные, т.е. их область видимости - непосредственно функция, где они используются.
Сделай так:
C++
1
void List::Task(List& L1,List& L2)
1
1 / 1 / 1
Регистрация: 09.11.2012
Сообщений: 82
30.09.2013, 23:14  [ТС]
Гениально! Спасибо огромное, что бы я без Вас делала!..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.09.2013, 23:14
Помогаю со студенческими работами здесь

Организовать ввод и формирование двух вещественных списков с проверкой. Найти их объединение без повторов
Организовать ввод и формирование двух вещественных списков с проверкой. Найти их объединение без повторов. Упорядочить полученный список по...

Как из двух списков сделать один список кортежей/списков
Доброго времени суток! Буду очень благодарен, если поможете из двух списков, к примеру a и b, сделать список c, который содержит пары...

Сумма двух списков списков в Prolog
Есть условие задачи: Построение списка, являющегося поэлементной суммой двух числовых списков одинаковой длины. Не могу понять, как так...

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

Формирование таблицы на основе списков
Задание такое: Сформировать таблицу из списка. Массив в данной программе является Индексом. Т.е добавляется запись у которой...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru