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

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

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

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

13.11.2011, 15:30. Просмотров 646. Ответов 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). Как это исправить? Я не очень шарю в указателях....
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.11.2011, 15:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вставка списка. (C++):

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

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

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

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

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

Написать код программы, выполняющей растяжку списка и вставку, удаление из списка и сжатие списка - C++
Люди ПОМОГИТЕ осталось совсем мало , мне нужна помощь!!! написать код программ: 1) Написать код программы, выполняющей растяжку...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
-=ЮрА=-
Заблокирован
Автор 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;
}
0
Миниатюры
Вставка списка.  
-=ЮрА=-
03.12.2011, 22:54
  #3

Не по теме:

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

0
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;
                }               
            }   
        }
 
}
*/
0
-=ЮрА=-
Заблокирован
Автор FAQ
25.12.2011, 18:22 #5
KOPC1886, Я уже говорил вставлять проще всего так
Списки А,В,С
Есть АВ надо встваить С после А
Вот мнемоалгоритм
А[start]В[end]СВ затем берёшь и связываешь [start] с [end] в итоге выходит АСВ
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.12.2011, 18:22
Привет! Вот еще темы с ответами:

Реализовать ведение списка забронированных и списка купленных билетов в кинозале кинотеатра - C++
Приветствую! работаю на Builder Borland c++ - программирую таблицы и кнопки такое задание : Реализовать ведение списка забронированных...

Списки. Функции добавление списка в конец и в середину другого списка. - C++
Всем привет!) Я вот написал две функции, 1- добавляется список2 в середину списка1, а 2 - добавляет список2 в конец списка1....когда я...

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

Привести пример реализации любого линейного списка списка с использованием лишь структур - C++
Буду благодарен, если кто-нибудь сможет привести пример реализации любого линейного списка списка с использованием лишь структур (то есть...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
25.12.2011, 18:22
Ответ Создать тему
Опции темы

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