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

Списки. Функции добавление списка в конец и в середину другого списка. - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.67
KOPC1886
27 / 6 / 0
Регистрация: 28.10.2010
Сообщений: 352
25.12.2011, 17:55     Списки. Функции добавление списка в конец и в середину другого списка. #1
Всем привет!) Я вот написал две функции, 1- добавляется список2 в середину списка1, а 2 - добавляет список2 в конец списка1....когда я использую каждую функцию по отдельности, все прекрасно работает, а когда использую обе сразу..то у меня вывод бесконечен. В чем дело? Где я ошибся? Вот код:
Сами функции..они в хедере H2
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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
#include <iostream>
using namespace std;
struct Node
{
        char a;
        Node *next;
        Node *prev;
 
};
 
 
Node * first(char a);
void PrintList(Node *pbeg);
void add(Node **pend, char a);
void dob(Node *pbeg, Node *n2, char a);
void konSp(Node *pbeg, Node *n2);
Node * find(Node * const pbeg, int i);
bool remove(Node **pbeg, Node **pend, int key);
Node * incert(Node * const pbeg, Node **pend, int key, char a);
Node *searchEnd(Node *n2);
///////////////////////////////////////////////////////////////////
 
// Формирование первого элемента
Node * first(char a)
{
        Node *pv = new Node;
        pv->a = a;
        pv->next = 0;
        pv->prev = 0;
        
        return pv;
}
//
//Добавление списка2 в середину списка1 после элемента "a"
void dob(Node *pbeg, Node *n2, char a)
{
    Node *pv=pbeg;
    Node *ph=new Node;
    Node *pk=new Node;
    while(pv->next)
    {   
        if(pv->a==a)
        {
            ph=searchEnd(n2);
            pk=pv;
            ph->next=pk->next;  
            pk->next=n2;                    
        }
        pv=pv->next;                    
    }
 
}
 
//Добавление списка2 в конец списка1
void konSp(Node *pbeg, Node *n2)
{
    Node *pv=pbeg;
    while(pv->next!=NULL)
    {       
        pv=pv->next;
    }
    //break;
    pv->next=n2;
    
    //return pbeg;
    
}
 
// Добавление в конец списка
void add(Node **pend,char a)
{
        Node *pv = new Node;
        pv->a = a; 
        pv->next = 0; 
        pv->prev = *pend;
        (*pend)->next = pv;
        *pend = pv;
 
}
 
Node * add1(Node **pend, char a)
{
    Node *pv = new Node;
    pv->a        = a; 
    pv->next = 0; 
    pv->prev = *pend;
    (*pend)->next = pv;
    return (*pend = pv);
}
/////////////////
// Печать списка
void PrintList(Node *pbeg)
{
    // pv пробегает по списку, начиная с головы
    Node *pv = pbeg;
    while(pv )// пока не конец списка, печатать значение данных текущего узла 
        {
            cout<<pv->a;
    
            pv = pv->next; // перейти к следующему узлу 
        }
}
//////////////////////
Node *searchEnd(Node *n2)
{
    Node *pt=new Node;
    while(n2)
    {
        n2=n2->next;
        if(n2->next==NULL)
        {
            pt=n2;
            break;
        }
    }
    return pt;
}
 
///////////////////////////////
Node * find(Node * const pbeg,int i)
{
        Node *pv = pbeg;
        while (pv)
        {
                if (pv->a==i)break;
                {
                        
                        pv=pv->next;
                }
        }
                return pv;
 
 
}
 
// Удаление элемента
 
bool remove(Node **pbeg, Node **pend, int key){
if(Node *pkey = find(*pbeg, key)){
        if (pkey == *pbeg)
        { // 2
                *pbeg = (*pbeg)->next;
                (*pbeg)->prev =0;
        }
        else if (pkey == *pend){ // 3
                *pend = (*pend)->prev;
                (*pend)->next =0;}
else
{        // 4
        (pkey->prev)->next = pkey->next;
        (pkey->next)->prev = pkey->prev;
}
 
delete pkey;
return true; // 5
}
return false; 
}// 6
 
//
// Вставка элемента
 
Node * incert (Node * const pbeg, Node **pend, int key, char a){
if(Node *pkey = find(pbeg, key)){
Node *pv = new Node;
pv->a = a;
// 1 - установление связи нового узла с последующим:
pv->next = pkey->next;
// 2 - установление связи нового узла с предыдущим:
pv->prev = pkey;
// 3 - установление связи предыдущего узла с новым:
pkey->next = pv;
// 4 - установление связи последующего узла с новым:
if( pkey != *pend) (pv->next)->prev = pv;
// Обновление указателя на конец списка,
// если узел вставляется в конец:
else *pend = pv;
return pv;
}
 
 
 
return 0;
}
А вот сам main
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
// Списки и структуры.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:
 
        /*// Поис скобок и их замена на пробелы
        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->a=='v')
        {
            pk=pv;
            //ph=searchEnd(pbeg);           
            //pv->next=n2;      
            pk->next=n2;
    
        }*/
        
        //Вставка списка №2 в список №1  функция  
        dob(pbeg,n2,'c');
        konSp(pbeg,n2);
        // вывод списка на экран
        
        PrintList(pbeg);
    
    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;
                }               
            }   
        }
 
}
*/
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.12.2011, 17:55     Списки. Функции добавление списка в конец и в середину другого списка.
Посмотрите здесь:

Списки структур. Указатель на узел другого списка внутри структуры C++
Добавление элемента в конец односвязного списка - ошибка C++
Добавление элемента в середину списка C++
Добавление в конец двусвязного списка C++
C++ Не работает добавление в конец односвязного списка
Добавление элемента в конец списка C++
C++ Добавление в конец списка
Добавление элемента в конец списка C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
26.12.2011, 23:19     Списки. Функции добавление списка в конец и в середину другого списка. #2
KOPC1886, я начал завтра доведу, внимательно изучи(подумай почему я так сделал, в єтот раз коментов дал больше поймёшь свои ошибки)
Nodes.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
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
#include <iostream>
using namespace std;
struct Node
{
        char a;
        Node *next;
        Node *prev;
 
};
 
 
Node * first(char a);
void add(Node **pend, char a);
void PrintList(Node *pbeg);
Node *searchBeg(Node *pv);
Node *searchEnd(Node *pv);
///////////////////////////////////////////////////////////////////
 
// ÔîðìèðîâГ*Г*ГЁГҐ ïåðâîãî ýëåìåГ*ГІГ*
Node * first(char a)
{
    Node *pv = new Node;
    pv->a = a;
    pv->next = 0;
    pv->prev = 0;  
    return pv;
}
 
// ÄîáГ*âëåГ*ГЁГҐ Гў ГЄГ®Г*ГҐГ¶ Г±ГЇГЁГ±ГЄГ*
void add(Node **pend,char a)
{
    Node *pv = new Node;
    pv->a    = a; 
    pv->next = 0; 
    pv->prev = *pend;
    (*pend)->next = pv;
    *pend = pv;
}
 
/////////////////
// ГЏГҐГ·Г*ГІГј Г±ГЇГЁГ±ГЄГ*
void PrintList(Node *pbeg)
{
    // pv ïðîáåãГ*ГҐГІ ГЇГ® Г±ГЇГЁГ±ГЄГі, Г*Г*Г·ГЁГ*Г*Гї Г± ãîëîâû
    Node *pv = pbeg;
    while(pv)// ïîêГ* Г*ГҐ ГЄГ®Г*ГҐГ¶ Г±ГЇГЁГ±ГЄГ*, ГЇГҐГ·Г*ГІГ*ГІГј Г§Г*Г*Г·ГҐГ*ГЁГҐ Г¤Г*Г*Г*ûõ ГІГҐГЄГіГ№ГҐГЈГ® óçëГ* 
    {
        cout<<pv->a;
        pv = pv->next; // ïåðåéòè ГЄ ñëåäóþùåìó óçëó 
    }
}
 
//////////////////////
Node *searchBeg(Node *pv)
{
    while(pv->prev)
        pv = pv->prev;
    return pv;
}
 
//////////////////////
Node *searchEnd(Node *pv)
{
    while(pv->next)
        pv = pv->next;
    return pv;
}
 
//////////////////////////////
Node * find(
            Node * pv, char a
            /*int i - îïÿòü ГІГ» Г±Г® ñâîèì i Гў Г±ГЇГЁГ±ГЄГҐ Гі ГІГҐГЎГї Г·Г*ðû âîò ГЁ ГЁГ№ГЁ Г·Г*ðû*/
            )
{
    //Г…Г±ГІГј ñïèñîê Гў ГЄГ*êîé ГІГ® ïîçèöèè îòìГ*òûâГ*ГҐГ¬ ГўГ*Г*Г·Г*ëî
    Node *pbeg = searchBeg(pv);//Г*Г* ГўГ±ГїГЄГЁГ© ñëó÷Г*Г© îòìГ*òûâГ*ГҐГ¬
    //Г€ Г±Г*Г*Г·Г*Г«Г* óæå ГЁГ№ГҐГ¬ Г*Г*Гё char a ñðåäè Г·Г*ðîâ Г±ГЇГЁГ±ГЄГ* Г* Г*ГҐ int i
    //Г¤Г*ГўГ*Г© óæå ñëóøГ*Г© ìåГ*Гї èëè Г*ГҐ ïðîñè òîãäГ* Г® ïîìîùè!
    while (pbeg->next)
    {
        if (pbeg->a == a)
            break;
        pbeg = pbeg->next;
    }
    return pbeg;
}
main.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
// Списки и структуры.cpp : Defines the entry point for the console application.
//
#include "Nodes.h"
 
int main()
{
    Node *list1 = first('a'); // Формирование первого элемента списка 1
    Node *list2 = first('e'); // Формирование первого элемента списка 2
    Node *pbeg1 = list1;
    Node *pbeg2 = list2;
    // Спискb заканчивается, едва начавшись
    int size1;
    int size2;
    int i, scob = 0;
    char Form1[]={"bczxv"};//из массива в список №1
    size1 = strlen(Form1);
    for (i = 0; i < size1; i++)
    {
        add(&list1, Form1[i]);
        if (Form1[i]=='(')                            
            scob++;
        if (Form1[i]==')')
            scob--;   
    }   
    cout<<"\nList 1 :\n";
    PrintList(pbeg1);
    char Form2[]={"frt"};//из массива в список №2
    size2 = strlen(Form2);
    for (i = 0; i < size2; i++)
        add(&list2,Form2[i]);   
    cout<<"\nList 2 :\n";
    PrintList(pbeg2);  
    cout <<endl;
    cout<<"Enter char to find : ";
    char chr;cin>>chr;
    Node *pf = find(pbeg1,chr);
    Node *pend1 = searchEnd(pbeg1);
    Node *pend2 = searchEnd(pbeg2);
    Node *nextf = pf->next;
    if(!pf)
        cout<<"List1 not contain char : "<<chr<<endl;
    else
    {
        Node *pins = pend2;
        pins->next = nextf;
        //Не надо сотри - я просто показал стадии вставки
        //cout<<"\nTransforming List2\n";
        //PrintList(pbeg2);
        pbeg2->prev = pf;
        pf->next = pbeg2;
        cout<<"\nTransforming List1\n";
        PrintList(pbeg1);
        cout<<"\nInserting List2 in pos of char : "<<chr<<" of List1 complete\n";
    }
    system("pause");
    return 0;
}
Миниатюры
Списки. Функции добавление списка в конец и в середину другого списка.  
-=ЮрА=-
Заблокирован
Автор FAQ
26.12.2011, 23:34     Списки. Функции добавление списка в конец и в середину другого списка. #3
Это и есть твоя вставка
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Node *pins = pend2;
* * * * * * * * pins->next = nextf;
* * * * * * * * //Не надо сотри - я просто показал стадии вставки
* * * * * * * * //cout<<"\nTransforming List2\n";
* * * * * * * * //PrintList(pbeg2);
* * * * * * * * pbeg2->prev = pf;
* * * * * * * * pf->next = pbeg2;
* * * * * * * * cout<<"\nTransforming List1\n";
* * * * * * * * PrintList(pbeg1);
- хочешь вынеси в отдельную функцию, а я пошёл спать. Надеюсь твоя проблема теперь решена!

Добавлено через 2 минуты
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
cout<<"\nTransforming List1\n";
- стирай
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
cout<<"\nInserting List2 in pos of char : "<<chr<<" of List1 complete\n";
- стирай

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
//Не надо сотри - я просто показал стадии вставки
* * * * * * * * //cout<<"\nTransforming List2\n";
* * * * * * * * //PrintList(pbeg2);
- стирай
Остальное нужно!

Добавлено через 3 минуты
Цитата Сообщение от KOPC1886 Посмотреть сообщение
Node *pbeg = first('a'); // Формирование первого элемента списка 1
* * * * Node *pend = pbeg;
* * * * Node *n2=first('e');// Формирование первого элемента списка 2
* * * * Node *pend2=n2;
- Илья ты не обижайся но в таких задачах нужно всё однотипным делать у меня
pbeg - list1
pend1 - pend
n2 - list2
pend2 - pend2
Лично мне ложа руку на сердце понятней, что list1 - єто список №1, а list2 - список №2, у списков есть начало и конец (pbeg и pend) - как бі по логике напрашивается что у списка №1 pbeg и pend должны быть с единичкой вконце, а у второго списка с двоичкой!Привыкай писать так чтобы было понятно всем, включая и тебя самого!!!Реально корявыми названиями ты сам себя путаешь...
Yandex
Объявления
26.12.2011, 23:34     Списки. Функции добавление списка в конец и в середину другого списка.
Ответ Создать тему
Опции темы

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