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

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

Войти
Регистрация
Восстановить пароль
 
Алексей_2012
0 / 0 / 1
Регистрация: 26.04.2014
Сообщений: 118
#1

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

14.06.2015, 22:49. Просмотров 491. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.06.2015, 22:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Списки, как склеить списки между собой? (C++):

Односвязные списки: как работают? - C++
Здрасте всем! Есть такой вот односвязный список, объясните пожалуйста, как будет выглядеть функция добавления записи в конец такого...

Списки. Как правильней организовать? - C++
Вот текст программы #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;ctime&gt; #include &lt;cstdlib&gt; #include &lt;windows.h&gt; using...

Подскажите как отладить код (связанные списки) - C++
условие закомментировано в коде, подскажите, в чём ошибка? функция Sum Должна возвращать требуемое число // ВЫЧИСЛЯЕТ СУММУ ТЕХ ЭЛЕМЕНТОВ...

Л1 списки. Как вставить элемент перед последним? - C++
Помогите разобраться с линейным односвязным списком, пожалуйста. А именно, как вставить элемент перед последним?

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

Создать списки товаров, выпускаемых как одной, так и другой фирмой - C++
Дан список, содержащий перечень товаров, производимых концернами SHARP и LG. Создать списки товаров, выпускаемых как одной, так и другой...

4
Perfilov
264 / 164 / 43
Регистрация: 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
rikimaru2013
C++ Game Dev
2440 / 1133 / 240
Регистрация: 30.11.2013
Сообщений: 3,690
14.06.2015, 23:24 #3
Давайте рассуждать :
Цитата Сообщение от Алексей_2012 Посмотреть сообщение
При этом список 1 и список 2 существуют как самостоятельные объекты.
Скопируйте первый список (сделайте его копию 1 в 1), далее добавляйте все узлы второго списка в третий список. Итого у вас 3 списка которые живут своей жизню, если у них общие данные (управляют одной памятью, то тут уже нельзя говорить о самостоятельности и независимости от "действий" другого списка
0
Perfilov
264 / 164 / 43
Регистрация: 25.02.2015
Сообщений: 435
14.06.2015, 23:27 #4
да, если нужно не объединение одного в другой, а копия первого и второго, то как описано выше.
0
Алексей_2012
0 / 0 / 1
Регистрация: 26.04.2014
Сообщений: 118
15.06.2015, 10:40  [ТС] #5
а если нужно сделать метод для этого, то понадобится новое поле для класса? Есть какой-нибудь пример, как это должно быть? Пусть не рабочий, для наглядности.

Добавлено через 10 часов 32 минуты
Ребят, есть какие- нибудь идеи?
0
15.06.2015, 10:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.06.2015, 10:40
Привет! Вот еще темы с ответами:

Как синхронизировать между собой два потока - C++
Привет, народ. Есть вопросик по потокам. Callback функция постоянно дёргает решатель в отдельном потоке. В примере это цикл в функции...

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

Списки. Как создать одновременно 2 списка? Как из второго списка поместить элементы в первый? - C++
2 самых главных вопроса: как создать одновременно 2 списка? как из второго списка поместить элементы в первый? Вообще нигде не могу...

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


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

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

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