0 / 0 / 1
Регистрация: 26.04.2014
Сообщений: 134
1

Списки, как склеить списки между собой?

14.06.2015, 22:49. Показов 1667. Ответов 4
Метки нет (Все метки)

Ребят, привет всем, есть код, в классе которого описаны несколько методов: добавление элемента в список, удаление и просмотр списка, дак вот вопрос, как реализовать метод (или функцию в реализации самой программы, а не в методе класса), в котором:

к общему списку приклеиваются элементы нового, т.е. ввели

список 1
3
4
5
6

список 2
4
5
6

итог
3
4
5
6
4
5
6

При этом список 1 и список 2 существуют как самостоятельные объекты.

Ребят, помогайте, мой мозг заточен под экономику, а сдавать уже послезавтра.

Вот все что есть.

*.h
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
#ifndef PEREGRUZ_H
#define PEREGRUZ_H
#include <iostream>
 
using namespace std;
 
struct node
{
    int data;
    node* next;
};
 
class linklist
{
private:
    node * first;
public:
    linklist() { first = NULL; }
    void additem(int d);
    void show();
    void delet(int n); // функция удаление конкретного элемента из списка
};
 
#endif // PEREGRUZ_H
*.cpp
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
#include "peregruz.h"
 
 
void linklist::additem(int d)
{
    node* newnode = new node; // создаём новый элемент списка
    newnode->data = d; // присваиваем полю data, значение переданное в как аргумент функции
    if(first == NULL) // если элемент первый в списки, то есть first равно NULL
    {
        newnode->next = first; // указателю на следующий элемент, присваиваем значение хранящиеся в указатели first
        first = newnode;       // присваиваем указателю first, значение на новый элемент списка
    }
    else // ели элемент не первый в списке
    {
        node* current = first; // создаём элемент текущей и присвоим ему firts, то есть начало списка
        while(current->next!=NULL) // цикл идёт до тех пор пока указатель элемента не равен значению NULL, то есть до конца списка
            current = current->next;// переходим от узла к узлу
        current->next = newnode; // когда мы достигли конца списка, элемент расположенный в конце, указывает на наш новый элемент
        newnode->next = NULL;    // новый элемент указывает, на NULL, то есть на конец списка
    }
}
 
void linklist::show()
{
    node* current = first;
    while(current)
    {
        cout << current->data << " ";
        current = current->next;
    }
}
 
void linklist::delet(int n) // функция удаления конкретного элемента из списка
{
 
    if (n<=0)
    {
        cout<<"\nError!!\n";
        return;
    };
 
    int count = 1;     // счётчик элементов, начинаем с первого элемента
    node* current = first; // текущий элемент
    node* temp;             // временный элемент
 
    if(n == count)
    {
        first = current ->next;
        current -> next = 0;
        delete current;
    }
    else
    {
        while(count != n) // проходим циклом, пока не дойдём до элемента с искомым номером
        {
            temp = current; // временному присваиваем текущий
            current = current->next; // переход на следующий узел
            count++;
        }
 
        temp->next = current->next; // временный ( то есть элемент, стоящий перед текущим, указывает на элемент идущий после текущего
        delete current; // удаляем текущий
    }
}
консоль
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
#include "peregruz.h"
 
int main()
{
   
 
 
 
    linklist li;
    int chislo=0,count;
    int menu;
 
    do{
        system("cls");
        cout <<"Vvedite colich dobavl in spisok...";
        cin >>count;
        cin.ignore();
 
        while (count>0)
        {
            // cout<<"Vvedite chislo ... ";
 
            //   cin>>chislo;
 
            li.additem(count);
            count--;
        }
 
        cout<<endl;
 
        li.show();
 
        cout <<endl<<"Ykagite No ydal chisla...";
        cin>>count;
        cin.ignore();
 
        li.delet(count);
 
        cout<<endl;
        li.show();
        cout<<"\nExit? 0-yes.";
        cin>>menu;
    }
 
    while (menu!=0);
    cout<<"POKEDA!";
 
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.06.2015, 22:49
Ответы с готовыми решениями:

Выпадающие списки связанные между собой
Проблема: Есть 3 таблицы 'Здание', 'Помещение', 'Оборудование'. Подскажите пожалуйста как создать...

Разделить списки li между собой вертикальными линиями
Привет всем делаю меню и не знаю как разделить каждую ссылку между собой нарисованной вертикальной...

Списки, списки, списки. не все так просто
Написать функцию, которая принимает 2 списка, содержащие одинаковое число строк, затем изменяет...

Как преобразовать вложенные списки из строки в обычные списки?
Доброе утро, форумчане. Подскажите пожалуйста, мне нужно написать скрипт, который разбирает...

4
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
14.06.2015, 23:22 2
в общих чертах:
C++
1
2
3
4
5
6
7
8
9
10
11
12
void linklist::splice(linklist& other)
{
   node* thisFirst = first; // первый елемент текущего объекта
   node* thisLast = ... // по цепочке доходим до последнего узла текущего списка. у него next == NULL
   
   // теперь к текущему последнему присовокупляем первый элемент от пришедшего и обнуляем его у
   // у пришедшего:
   thisLast->next = other.first;
   other.first = NULL;
 
   // все. узлы пришедшего перекинули в текущий.
}
позможно придется дойти не до последнего, а до предпоследнего, чтобы изменение
возимело эффект:
thisLast->next->next = other.first;
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
14.06.2015, 23:24 3
Давайте рассуждать :
Цитата Сообщение от Алексей_2012 Посмотреть сообщение
При этом список 1 и список 2 существуют как самостоятельные объекты.
Скопируйте первый список (сделайте его копию 1 в 1), далее добавляйте все узлы второго списка в третий список. Итого у вас 3 списка которые живут своей жизню, если у них общие данные (управляют одной памятью, то тут уже нельзя говорить о самостоятельности и независимости от "действий" другого списка
0
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
14.06.2015, 23:27 4
да, если нужно не объединение одного в другой, а копия первого и второго, то как описано выше.
0
0 / 0 / 1
Регистрация: 26.04.2014
Сообщений: 134
15.06.2015, 10:40  [ТС] 5
а если нужно сделать метод для этого, то понадобится новое поле для класса? Есть какой-нибудь пример, как это должно быть? Пусть не рабочий, для наглядности.

Добавлено через 10 часов 32 минуты
Ребят, есть какие- нибудь идеи?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.06.2015, 10:40
Помогаю со студенческими работами здесь

Список женихов и невест. Обьеденить списки в списки пар.
Имеется список женихов и невест. каждая запись списка содержит пол, имя, возраст, рост, вес, а...

Дан вектор, элементы которого списки из целых чисел.Заменить на NILL списки с суммой равной 0
Дан вектор, элементы которого списки из целых чисел.Заменить на NILL списки с суммой равной 0.

Зависимые списки, снова списки и проблема
&lt;div class=&quot;t-product__option js-product-option newselect&quot;&gt; &lt;div class=&quot;t-product__option-title...

Даны списки чисел, нужно вывести список всех возможных комбинаций чисел, составляющих эти списки
Даны списки чисел, нужно вывести список всех возможных комбинаций чисел, составляющих эти списки...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru