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

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

Войти
Регистрация
Восстановить пароль
 
KOPC1886
27 / 6 / 0
Регистрация: 28.10.2010
Сообщений: 352
#1

Вставка списка. - C++

13.11.2011, 15:30. Просмотров 634. Ответов 4
Метки нет (Все метки)

Здравствуйте!) У меня есть два списка. Мне нужно вставить один список в другой. Вот что у меня получилось.
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
132
133
134
135
// Списки и структуры.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include "H1.h"
using namespace std;
 
//void sk(Node *pbeg,Node *pend);
 
int _tmain(int argc, _TCHAR* argv[])
{
    Node *pbeg = first('a'); // Формирование первого элемента списка 1
    Node *pend = pbeg;
    Node *n2=first('e');// Формирование первого элемента списка 2
    Node *pendn=n2;
    // Спискb заканчивается, едва начавшись
    
    /*
     ifstream fin("array.txt", ios::in);
     if (!fin)      cout << "Not file!"<< endl;
     int nrow, i;
     fin >> nrow;
     char *M = new char [nrow];
     for (i = 0; i < nrow; i++)      fin >> *(M + i);
*/
    int size;
    int size2;
    int ind;
    int scob=0;
    char Form[]={"bcd"};//из массива в список №1
    size=strlen(Form);
    for (int i = 0; i<size; i++)
    {
        add(&pend,Form[i]);
        if (Form[i]=='(')
        {               
            scob++;
            ind=i;
            
        }
        if (Form[i]==')')
        {
            scob--;
            ind=i;
        }   
    }       
    Node *pv = pbeg;
    Node *pk;
    char Temp[]={"frt"};//из массива в список №2
    size2=strlen(Temp);
    for (int i = 0; i<size2; i++)
    {   
        add(&pendn,Temp[i]);            
    }
    //incert(pbeg, &pend, 'y',&pendn);
    // Удаление элемента 5
    //if(!remove (&pbeg, &pend, Form[3]))cout << "не найден";
    // Вставка элемента 200 гюсле элемента 2:
    while (pv)
    {   
        /*
        if(pv->a=='(')
        {                   
            pk=pv;          
            while(pk->next!=NULL)
            {
                pk = pk->next;
                if(pk->a==')')
                {
                    pk->a=' ';
                    pv->a=' ';
                    break;
                }               
            }   
        }
        */
        
        //Вставка списка №2 в список №1
        if(pv->a=='c')
        {
            pk=pv;      
            pk->next=n2->next->prev;
        }   
        // вывод списка на экран
        cout << pv->a;
        pv = pv->next;
        
    }
    cout <<endl;
    
/*
    for(pv = pbeg; pv!=0; pv = pv-> next)
    {
        if(pv->a=='k')
        {
            pk=pv;
            pk=n2->next->prev;
        }
        cout<<pv->a;
    }
    
 
    
    if (scob> 0)
           cout << "( bigger"<<ind<<endl;
    else if (scob< 0) 
           cout << ") bigger"<<ind<<endl;
    else if (scob == 0) cout << "Good";
    */
 
    return 0;
}
 
/*void sk(Node **pbeg,Node **pend)
{
    Node *pv=new Node;
    if(pv->a=='(')
        {                   
            Node *pk=pv;            
            while(pk->next!=NULL)
            {
                pk = pk->next;
                if(pk->a==')')
                {
                    pk->a=' ';
                    pv->a=' ';
                    break;
                }               
            }   
        }
 
}
*/
У меня получается так...список№1 состоит из "abcd", а список№2 состоит из "efrt". Когда я вставляю список №2 в список №1 после символа 'c', то у меня пропадает символ 'd', хотя он должен быть последним элементом всего списка(список№1 + список№2). Как это исправить? Я не очень шарю в указателях....
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.11.2011, 15:30     Вставка списка.
Посмотрите здесь:

Вставка в начало списка - C++
Народ, поскажите как реализовать вставку в начало списка? текст вставки в конец сделал, а в начало не пойму как! Вот вставка в конец: int...

Односвязный список. Вставка списка - C++
Доброго времени суток. Кто может подсказать в чём причина того что я не могу присвоить значение типа char.. void add_elem(List**...

Вставка узла в середину двусвязного списка - C++
Уважаемые коллеги, прошу помощи! Изучаю двусвязный список. Вставку в конец и начало я реализовала, удаление из любого места тоже, но...

Вставка элемента в начало односвязного списка - C++
Помогите вставить элемент в начало односвязного списка. Написана функция Insert, но она работает только для вставки в середину и конец...

Итератор, вставка в произвольное место списка - C++
Здравствуйте. Подскажите как вставить значение в произвольное место списка используя итератор. Эта функция должна выглядеть так: ...

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
13.11.2011, 21:29     Вставка списка. #2
Цитата Сообщение от KOPC1886 Посмотреть сообщение
Здравствуйте!) У меня есть два списка. Мне нужно вставить один список в другой.
- я доделал
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
132
133
134
135
136
137
138
139
140
141
142
143
144
#include <iostream> //cout cin system
#include <cstdlib>  //strlen
using namespace std;
 
struct Node
{
    char a;
    Node *next;
    Node *prev;
};
 
//Формирование первого элемента
//я сделал функцию универсальной : 
//нет списка - выделили память
//есть список просто изменили букву в нём
Node * setfirst(Node **pbeg, char a)
{
    Node *pv = *pbeg;
    if(pv == NULL)
        pv = new Node;
    pv->a = a;
    pv->next = 0;
    pv->prev = 0;  
    return (*pbeg = pv);
}
//Возвращает первый узел в списке
Node * getfirst(Node *pend)
{
    Node *pv = pend;
    while(pv && pv->prev != 0)
        pv = pv->prev;
    return pv;
}
 
//Возвращает последний узел из списка
Node * getlast(Node *pend)
{
    Node *pv = pend;
    while(pv && pv->next != 0)
        pv = pv->next;
    return pv;
}
 
// Добавление в конец списка
Node * add(Node **pend, char a)
{
    Node *pv = new Node;
    pv->a    = a; 
    pv->next = 0; 
    pv->prev = *pend;
    (*pend)->next = pv;
    return (*pend = pv);
}
 
//Поиск в списке
Node * find(Node *pbeg, char a)
{
    Node *pv = getfirst(pbeg);
    while (pv->next != 0 && pv->a != a)
        pv = pv->next;
    return pv;
}
 
//Длинна списка - потом пригодиться
long length(Node *pend)
{
    long len = 0;
    Node *pv = getfirst(pend);
    if(pv->next != 0)
    {
        do
        {
            len++;
        }
        while((pv = pv->next) != 0);
    }
    return len;
}
 
//Удаление узла - единственную функцию которую пока не тестировал
/*Node * remove(Node **pbeg)
{
    if((*pbeg)->next == 0)
        (*pbeg)->prev->next = 0;
    else
        (*pbeg)->next->prev = (*pbeg)->next;
    return *pbeg;
}*/
 
//Вставка в список после узла *plst списка pins
Node * insert(Node **plst, Node *pins)
{
    const Node * pbeg = *plst;
    const Node * pend = pins;
    Node * pv = pins;
    if(pv->next != 0)
    {
        pv = getlast(pv);
        while((*plst)->next != 0)
        {
            add(&pv,(*plst)->a);
            *plst = (*plst)->next;
        }
        add(&pv,(*plst)->a);
        while(*plst != pbeg)
            *plst = (*plst)->prev;
        pv = getfirst(pv);
        pv->prev = (*plst)->prev;
        (*plst)->prev->next = pv;
    }
    return (*plst = getfirst(*plst));
}
 
int main()
{
    Node *pList1 = NULL;
    Node *pList2 = NULL;
    setfirst(&pList1,'a'); // Формирование первого элемента списка
    char str1[]= {"bcd"};
    char str2[]= {"234567"};
    long size1  = strlen(str1);
    for(long i = 0; i < size1; i++)
        add(&pList1,str1[i]);
    setfirst(&pList2,'1');
    long size2  = strlen(str2);
    for(i = 0; i < size2; i++)
        add(&pList2,str2[i]);
    cout<<"List 1 : "<<'a'<<str1<<endl;
    cout<<"List 2 : "<<'1'<<str2<<endl;
    cout<<"Enter position of inserting\n";
    cout<<"0 < pos < "<<length(pList1)<<endl;
    long pos;cin>>pos;
    Node * plst = find(pList1, str1[pos - 1]);
    pList2 = getfirst(pList2);
    pList1 = insert(&plst, pList2);
    while(pList1->next != 0)
    {
        cout<<pList1->a;
        pList1 = pList1->next;
    }
    cout<<pList1->a<<endl;
    system("pause");
    return 0;
}
Миниатюры
Вставка списка.  
-=ЮрА=-
03.12.2011, 22:54
  #3

Не по теме:

KOPC1886, я оживил топик, завтра плотно займусь!

KOPC1886
27 / 6 / 0
Регистрация: 28.10.2010
Сообщений: 352
20.12.2011, 19:17  [ТС]     Вставка списка. #4
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
// Списки и структуры.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include "H1.h"
using namespace std;
 
//void sk(Node *pbeg,Node *pend);
 
int _tmain(int argc, _TCHAR* argv[])
{
    Node *pbeg = first('a'); // Формирование первого элемента списка 1
    Node *pend = pbeg;
    Node *n2=first('e');// Формирование первого элемента списка 2
    Node *pend2=n2;
    // Спискb заканчивается, едва начавшись
    
    /*
     ifstream fin("array.txt", ios::in);
     if (!fin)      cout << "Not file!"<< endl;
     int nrow, i;
     fin >> nrow;
     char *M = new char [nrow];
     for (i = 0; i < nrow; i++)      fin >> *(M + i);
*/
    int size;
    int size2;
    int ind;
    int scob=0;
    char Form[]={"bczxv"};//из массива в список №1
    size=strlen(Form);
    for (int i = 0; i<size; i++)
    {
        //add(&pend,Form[i]);
        add1(&pend, Form[i]);
        if (Form[i]=='(')
        {               
            scob++;
            ind=i;
            
        }
        if (Form[i]==')')
        {
            scob--;
            ind=i;
        }   
    }       
    Node *pv = pbeg;
    Node *ph=new Node;
    Node *pd=new Node;  
    Node *pk=new Node;
    
    char Temp[]={"frt"};//из массива в список №2
    size2=strlen(Temp);
    for (int i = 0; i<size2; i++)
    {   
        add(&pend2,Temp[i]);            
    }
    //incert(pbeg, &pend, 'y',&pendn);
    // Удаление элемента 5
    //if(!remove (&pbeg, &pend, Form[3]))cout << "не найден";
    // Вставка элемента 200 гюсле элемента 2:
    while (pv)
    {   
        /*// Поис скобок и их замена на пробелы
        if(pv->a=='(')
        {                   
            pk=pv;          
            while(pk->next!=NULL)
            {
                pk = pk->next;
                if(pk->a==')')
                {
                    pk->a=' ';
                    pv->a=' ';
                    break;
                }               
            }   
        }   */  
        //Вставка списка №2 в список №1     
        if(pv->a=='c')
        {
            ph=searchEnd(n2);
            pk=pv;
            ph->next=pk->next;  
            pk->next=n2;        
        }
        //Вставка списка №2 после списка №1 
        /*
        if(pv->next==0)
        {
            pk=pv;
            //ph=searchEnd(pbeg);           
            //pv->next=n2;
            pk->a='y';
            pk->next=n2->next;
    
        }*/
        //Вставка списка №2 в список №1  функция  
        //dob(pbeg,n2,'c');
        // вывод списка на экран
        cout << pv->a;
        pv = pv->next;
    
        
    }
 
    cout <<endl;
    
/*
    for(pv = pbeg; pv!=0; pv = pv-> next)
    {
        if(pv->a=='k')
        {
            pk=pv;
            pk=n2->next->prev;
        }
        cout<<pv->a;
    }
    
 
    
    if (scob> 0)
           cout << "( bigger"<<ind<<endl;
    else if (scob< 0) 
           cout << ") bigger"<<ind<<endl;
    else if (scob == 0) cout << "Good";
    */
 
    return 0;
}
 
/*void sk(Node **pbeg,Node **pend)
{
    Node *pv=new Node;
    if(pv->a=='(')
        {                   
            Node *pk=pv;            
            while(pk->next!=NULL)
            {
                pk = pk->next;
                if(pk->a==')')
                {
                    pk->a=' ';
                    pv->a=' ';
                    break;
                }               
            }   
        }
 
}
*/
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.12.2011, 18:22     Вставка списка.
Еще ссылки по теме:

Построить класс для работы с односвязным списком. Создать два списка: List1 и List2. Проверить, содержатся ли элементы списка List1 в списке List2 в у - C++
Построить класс для работы с односвязным списком. Создать два списка: List1 и List2. Проверить, содержатся ли элементы списка List1 в...

вставка - C++
А вот еще сортировка вставкой..вообще бред какой-то получился(( #include&lt;iostream&gt; #include&lt;ctime&gt; using namespace std; void main()...

Вставка функции - C++
Всем привет, помогите вставить функцию в программу. #include &lt;vcl.h&gt; #include &lt;iostream.h&gt; #include &lt;conio.h&gt; int...

asm вставка в C++ - C++
есть код #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; slozh(int* pi1, int...


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

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
Заблокирован
Автор FAQ
25.12.2011, 18:22     Вставка списка. #5
KOPC1886, Я уже говорил вставлять проще всего так
Списки А,В,С
Есть АВ надо встваить С после А
Вот мнемоалгоритм
А[start]В[end]СВ затем берёшь и связываешь [start] с [end] в итоге выходит АСВ
Yandex
Объявления
25.12.2011, 18:22     Вставка списка.
Ответ Создать тему
Опции темы

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