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

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

Восстановить пароль Регистрация
 
KOPC1886
27 / 6 / 0
Регистрация: 28.10.2010
Сообщений: 352
13.11.2011, 15:30     Вставка списка. #1
Здравствуйте!) У меня есть два списка. Мне нужно вставить один список в другой. Вот что у меня получилось.
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++ Описать функцию, которая определяет, входят ли все элементы первого списка в состав второго списка.
C++ Удалить из списка все элементы с нечётными значениями и вывести указатель p2 на начало преобразованного списка.
Списки. Функции добавление списка в конец и в середину другого списка. C++
Дублирование вхождения каждого элемента списка One и формирование из этих значений списка Double (пояснить условие) C++
C++ Итератор, вставка в произвольное место списка
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор 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;
                }               
            }   
        }
 
}
*/
-=ЮрА=-
Заблокирован
Автор FAQ
25.12.2011, 18:22     Вставка списка. #5
KOPC1886, Я уже говорил вставлять проще всего так
Списки А,В,С
Есть АВ надо встваить С после А
Вот мнемоалгоритм
А[start]В[end]СВ затем берёшь и связываешь [start] с [end] в итоге выходит АСВ
Yandex
Объявления
25.12.2011, 18:22     Вставка списка.
Ответ Создать тему
Опции темы

Текущее время: 23:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru